2009-10-29 5 views
8

는 C++ 프로그램<double> * int가 C++에서 정의되지 않은 이유는 무엇입니까?

#include <complex> 
#include <iostream> 

int main() 
{ 
    std::complex<double> z(0,2); 
    int n = 3; 
    std::cout << z * n << std::endl; 
} 

오류를 얻을 수 없음 '의 Z * N의'에서 '* 연산자'에 대한 매치. 왜?

g ++ 4.4.1로 컴파일 중입니다. 아마도 컴파일러는 C++ 표준을 따르고 있습니다.이 경우 제 질문은 : 표준이 왜 이것을 허용하지 않습니까?

답변

14

이 작동 : 복잡한이 복식으로 구성되어

#include <complex> 
#include <iostream> 

int main() 
{ 
    std::complex<double> z(0,2); 
    double n = 3.0; // Note, double 
    std::cout << z * n << std::endl; 
} 

때문에,이 두 배에 곱합니다. 선언에서 상대 : (다음은 dribeas 덕분에) 컴파일러를 전달하여, 그래서 템플릿 공제시 암시 적 형식 변환을 할 수 없습니다

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

complex가 다음 다른 double 인, 및 T 와 Tint 인 경우 double으로 처리하는 함수를 일치 시키려고하면 두 번째 인수가 잘못 일치하고 그 반대의 경우도 마찬가지입니다.

는 기능이 유사한 정의하는 작업 할 무엇, 그것은했을 경우 : operator*=를 호출 할 때

함수가 주조를 허용 다른 형식을 취할 수 있습니다
template <typename T, typename U> 
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs) 
{ 
    return lhs *= rhs; 
} 

완료합니다.

+0

는 생각 복잡한는 클래스이며, *는 그 클래스에 대한 과부하 때문에, 그 원시적되지는 컴파일러 – ldog

+0

감사에서 규칙을 캐스팅 따르지 않도록 , 나는 모호성에 대한 실수를 정정하고 연산자를 올바르게 코딩하지 않았다. (두 번째 작업을 수행 했어야하지만 첫 번째 작업은 나에게 수업 일 것입니다.) – GManNickG

+0

처음에 제공 한 연산자의 구현은 정확하지 않습니다. (보통 프로젝트에서는 차이가 다소 작을 것입니다.) –

2

std::complex<T>의 연산자는 다른 complex<T> 인스턴스를 인수로 사용하도록 정의되었습니다. int에서 double을 거쳐 complex<double>에 이르기까지의 경로는 표준에 따라 C++ 언어를 따르기에 약간 변이가되어 있습니다. (이미 자유 회전 변환과 cohercions에서 발생하는 큰 복잡성으로 인해 을 비난하기가 어렵습니다. 표준의 측면). 나는 complex<double>의 슈퍼 특수한 케이스가 비어있는 int을 오퍼레이터로서 피연산자로 허용한다고 생각했다. 프로그래머가 얼마나 쉽게 쉽게 캐스팅 할 수 있는지 고려해 볼 때 매우 개별적인 케이스에 대한 템플릿 전문화를 지정하기에 충분할만큼 중요하고 중요하지 않은 것으로 생각된다. int ! double에 그것은 실제로 을 원하는 때 -)

+0

-1 :이 표준은 std :: complex 에 T를 곱하기위한 대칭형 자유 함수를 제공합니다 (C++ 03, 26.2.6 [lib.complex.ops] 복잡한 비 멤버 연산). –

관련 문제