2013-05-10 2 views
3

에 함수 정의와 일치 할 수없는 ++ 2010 MSVC, 선언 블록 외부 템플릿 클래스 멤버를 정의 :템플릿 기반 클래스 : 사용하여 기존의 선언

template <typename T> class cls { 
public: 
    template <typename T> void bar(T x); 
}; 
template <typename T> void cls<T>::bar(T x) {} 

수율 :

unable to match function definition to an existing declaration 
1>   definition 
1>   'void cls<T>::bar(T)' 
1>   existing declarations 
1>   'void cls<T>::bar(T)' 

이유는 무엇입니까?

template <typename P> 
template <typename T> 
void cls<P>::bar(T x) {} 

을하지만 bar 전혀 템플릿 할 필요가 없습니다 것을 나에게 보인다 각각의 구조가 다른 템플릿 인수에 작동하기 때문에

답변

5

당신은 두 개의 템플릿 선언이 필요합니다. 회원의 템플릿 매개 변수는 그림자하지 않아야한다는

template <typename T> class cls { 
public: 
    template <typename U> void bar(U x); 
}; 

template<typename T> 
template<typename U> 
void cls<T>::bar(U x) { } 

참고 :이 대신 사용

template <typename T> 
class cls 
{ 
    public: 
     void bar(T x); 
}; 

template <typename T> void cls<T>::bar(T x) {} 
+0

''명시 적 템플릿 인수를 사용하지 않습니다. ' – mchen

+0

예제에서는'' 템플릿을 두 번 사용합니다. 이것이 오류의 원인입니다. 형식 이름을 다른 것으로 변경하십시오. – 0x499602D2

+0

'bar'에 대한 템플릿 매개 변수를 명시 적으로 작성하면 안됩니다. 이것은 부분 전문화로 파싱됩니다. – jrok

0

당신이 bar이 멤버 템플릿이 될 수 있도록 의도가 있다면, 당신이 필요합니다 클래스 템플릿 매개 변수이므로 U으로 변경했습니다.

관련 문제