2011-02-23 9 views
0

다음 코드 형 변환을 용이하게 추가 또는 괄호를 사용하여 곱셈의 순서를 변경함으로써 해결 될 수여기에서 왜 형 변환이 작동하지 않습니까?

#define IMG_I (std::complex<double>(0, 1)) 
#define PI 3.1415926535 
for (unsigned long int j = 0; j < 10; ++j) 
    std::cout << exp(-IMG_I * PI * j); 

캐스팅 입력 오류를 갖는다. 그러나 왜 타입 캐스팅 문제가 처음부터 발생하고 왜 C++이 위 코드를 그대로 처리 할 수 ​​없는지는 분명하지 않습니다.

누구든지 나를 설명 할 수 있습니까? 템플릿의 순서를

template<typename T> 
complex<T> operator*(const complex<T>& lhs, const T& val); 

lhs 인수 complex<T>Tval 인수의 T과 동일해야합니다 :

+5

오류가 발생하는 경우는 어떻습니까? 나는 컴파일러가 '- (std :: complex (0, 1))'문제가있을 수 있다고 의심하지만, 오류 메시지 없이는 말하기가 어렵다. – tloach

+3

왜 'const std :: complex'를 사용하지 않는가? IMG_I (0, 1); –

+0

매크로가 호환되지 않는 유형에 대한 암시 적 캐스팅 중 일부를 숨기고 있습니다 ... – AJG85

답변

8

std::complex에 대한이 operator* 과부하처럼 보이는 선언 함수 템플릿입니다 인수 공제가 작동합니다.

당신은 std::complex<double> (-IMG_I * PI의 종류)로 전화를 시도하고 unsigned long (j의 종류). doubleunsigned long은 같은 유형이 아니므로 템플릿 인수 공제가 실패합니다.

-IMG_I * (PI * j)PI * j 유형이 double이므로 작동하지 않으므로 T은 무엇인지 모호하지 않습니다. 마찬가지로 -IMG_I * PI * static_cast<double>(j)도 같은 이유로 작동합니다.

+0

static_cast에 대해 +2를 줄 수 있기를 바란다. – AJG85

0

복잡한 정의 헤더 파일을 보면 : 당신이 볼 그 대신이 _Tp (이 경우 이중에), 두 번째 매개 변수는 const _Tp&이다 받아들이는 것

template
inline complex<_Tp>
operator*(const complex<_Tp>& __x, const _Tp& __y)
{
complex<_Tp> __r = __x;
__r *= __y;
return __r;
}

. 즉, C++은 정수 j에서 암시 적 캐스트를 수행하지 않으므로 오류가 발생합니다.

두 번째 매개 변수가 _Tp으로 다시 작성된 경우 C++의 내장형 암시 적 유형 변환은 정수를 double로 변환하여 코드를 컴파일합니다.

+0

이것은 틀린 말이다 : 우리가 인수 공제 실패가 없다면 (예를 들어, 매개 변수가'complex '와'U'),''unsigned long''에서 일시적인'double'이 만들어지고 그 임시는'operator *'에 전달 될 수 있습니다. 그것은 매개 변수가 임시로 바인딩 할 수없는 비 const 참조 ('const T'대신 'T &') 인 경우에만 해당됩니다. –

+0

실례합니다. 너는 맞다. –

관련 문제