2010-04-13 2 views
3
template<class T> 
class test 
{ 
    public: 
     test() 
     { 
     } 

     test(T& e) 
     { 
     } 

}; 

int main() 
{ 

    test<double> d(4.3); 

    return 0; 
} 

다음과 같은 오류와 함께 g ++ 4.4.1를 사용하여 컴파일 :C++ 템플릿 : 암시 적 변환, 호출의 ctor하기 위해 일치하는 기능

g++ test.cpp -Wall -o test.exe 
test.cpp: In function 'int main()': 
test.cpp:18: error: no matching function for call to 'test<double>::test(double) 
' 
test.cpp:9: note: candidates are: test<T>::test(T&) [with T = double] 
test.cpp:5: note:     test<T>::test() [with T = double] 
test.cpp:3: note:     test<double>::test(const test<double>&) 
make: *** [test.exe] Error 1 

그러나,이 작품 :

double a=1.1; 
test<double> d(a); 

왜 이게 뭐야? g ++에서 리터럴 표현식 1.1을 암시 적으로 double로 변환 할 수 없습니까? 감사합니다. .

+0

생성자가 double을 사용하지 않으면 double에 대한 참조가 필요합니다. –

답변

3

생성자 정의의 참조 (&) 때문입니다. 이와 같은 참조로 상수 값을 전달할 수는 없으며 두 번째 예제와 같은 변수 만 전달할 수 있습니다.

+0

왜 downvote? 대답은 정확합니다. –

2

더블 리터럴을 (비 const) double &에 바인딩 할 수 없습니다.

대신 T const & 또는 값으로 전달 하시겠습니까? (어느 쪽이나 지금까지 부여한 코드에서 작동합니다.)

2

임시 참조가 아닌 참조를 사용할 수 없습니다.

test(const T& e) 
    { 
    } 

에 생성자를 변경 시도하거나 값으로 전달합니다

test(T e) 
    { 
    } 
8

을 당신은 const가 아닌 참조 T&에 이중 1.1을 전달하고 있습니다. 이것은 당신이 같은 수행하여 같은 생성자에 유효한 좌변을 통과해야 할 것 의미

double x = 4.3; 
test<double> d(x); 

생성자는 const를 참조 (const T&)를 가지고 있는지 확인하고 임시직을 결합 할 수 있기 때문에 그것은 작동 (우변) const 참조에, 그리고 4.3은 기술적으로 일시적인 이중입니다.