2013-06-13 6 views
1

아래에는 두 개의 프로그램과 출력이 있습니다.C++의 템플릿 - 명시 적 함수가 호출되지 않는 이유는 무엇입니까?

코드 1 :

#include<iostream> 
    using namespace std; 

    template <class X,class Y> X sumargs(X a,Y b) 
    { 
     cout<<"\nThe sum is :" << a+b; 

    } 

    int sumargs(int a,char b) 
    { 
     cout<<"\nThis works\n"; 
     return 1; 
    } 

    int main() 
    { 

     sumargs<int>(1,2); 
     sumargs<char>(4,9.0); 
     sumargs<double>('d',8); 
     sumargs(7,'a'); 
     return 0; 
    } 

출력 1

The sum is :3 
The sum is :13 
The sum is :108 
This works 

코드 2 :

#include<iostream> 
using namespace std; 

template <class X,class Y> X sumargs(X a,Y b) 
{ 
    cout<<"\nThe sum is :" << a+b; 

} 

int sumargs(int a,char b) 
{ 
    cout<<"\nThis works\n"; 
    return 1; 
} 

int main() 
{ 

    sumargs<int>(1,2); 
    sumargs<char>(4,9.0); 
    sumargs<double>('d',8); 
    sumargs<int>(7,'a'); 
    return 0; 
} 

출력 2

The sum is :3 
The sum is :13 
The sum is :108 
The sum is :104 

이유가 sumargs (7, 'a');코드 2 명시 적으로 오버로드 된 버전의 함수를 호출하지 않습니까? 여기

+0

첫 번째 템플릿을하려고 사용한다 'sumargs'는 컴파일되지 않아야합니다. 그것이 그것이라고 주장에도 불구하고 결코 가치를 반환하지 않습니다. –

+0

@SebastianRedl : 왜 오류를 감지하지 못합니까? g ++ 컴파일러를 사용하고 있습니다. – Inquisitive

+0

-Wall -Werror를 사용하십시오. g ++는 때로는 관대하게 관대하다. –

답변

5

:

sumargs<int>(7,'a'); 
//  ^^^^^ 

당신이 지정하는 템플릿 인수를 명시 적으로을 . 템플릿 인수를 명시 적으로 지정하기 때문에 컴파일러는 템플릿을 템플릿으로 간주하여 호출을 해결합니다.

오버로드가 템플릿이 아니며 비 템플릿이 템플릿 인수를 허용하지 않습니다. 따라서 컴파일러는이를 고려하지 않습니다. 앤디 배회의 대답에 추가

+0

은 반환 유형에 대해 이 아닙니까? – Inquisitive

+1

@Inquisitive : 그렇습니다.하지만 여전히 템플릿 인수입니다. 비 템플릿에는 템플릿 인수가 없습니다. 당신이 그것들을 사용하고 있기 때문에, 함수 템플릿 만이 컴파일러에 의해 고려됩니다. –

2

, 당신은 당신이 무엇을하고 있는지에 대한 템플릿 특수화를 사용할 수 있습니다 :

template<> 
int sumargs<int,char>(int a,char b) 
{ 
    cout<<"\nThis works\n"; 
    return 1; 
} 
+0

나는 늦었습니다. 나는 내 것을 지울 것입니다. – aah134

2

당신이

template <> 
int sumargs<int,char>(int a,char b) 
{ 
    cout<<"\nThis works\n"; 
    return 1; 
} 

는 특별한 기능을

관련 문제