2010-01-31 4 views
0

왜 유효한이 아니다?C++ 템플릿 클래스와 템플릿 기능

x=getMax(1, '2');    

그러나 이들은

x=getMax(1,2); 

이 템플릿 기능에는 형식 변환이 없다는 것을 의미합니까 유효?

이 유효하지 않습니다

x=GetMax::getMax(1, 2); 

는 템플릿 클래스에 대한 것을 뜻, 유형을 지정해야합니다?

+0

표준 자체에는 초와 비슷한 문제가 있습니다. 'std :: pair '은 그 타입이 지정되어야한다. 그래서'std :: make_pair (T1, T2)'함수가 있습니다. – MSalters

답변

3

getMax(1, '2');은 무엇을 반환해야합니까? int 또는 char?

당신은 쓸 수 : 그것에 대해 생각 :

template <class T1, class T2> T1 getMax (T1 a, T2 b) { 
    return (a>b?a:b); 
} 

을하지만 당신은 명시 적으로 타입 1을 반환하는 점에 유의, 무엇을 (100)는 문자 형식으로 변환 될 수 있기 때문에 getMax('1',1000) 같은 경우에 작동, 그리고하지 않을 수 있습니다 충분히 크지 않을 것이다.

클래스를 사용하기 때문에 후자는 유효하지 않습니다. 먼저 어떤 유형인지 명시해야합니다.이 메커니즘은 형식 공제 전에 먼저 작동합니다.

당신이 그것을 언급 한 경우가 작동합니다 :

class GetMax { 
public: 
    template <class T> 
    static T getMax(T a, T b) { 
     return (a>b?a:b); 
    }  
}; 
+0

'2'를 암시 적으로 int로 변환 할 수없는 이유는 무엇입니까? – skydoor

+0

@skydoor,'char' 또는'int'를 반환하고 싶다면 컴파일러는 어떻게 알 수 있습니까? –

+0

@skydoor 같은 질문을 할 수 있는데, 왜 '1'을 암시 적으로 char로 변환 할 수 없습니까? –

2

1)이 형식 변환은하지만 형식 유추와 함께 작동하지 않습니다. 형식을 지정하면 (예 : getMax<int>(1,'2') 또는 getMax<char>(1,'2')) 작동하지만 컴파일러는 getMax<int> 또는 getMax<char> 중 무엇을 사용할지를 결정할 수 없습니다.

2) 예, 템플릿 인수는 클래스 템플릿이 아닌 함수 템플릿에서만 유추됩니다.