2013-02-11 2 views
5

를 컴파일 실패 : 내가 얻을전화 나는 다음과 같은 형태의 코드 조각에 문제가

http://codepad.org/ZR1Std4k

:

template<class Type> 
class Class1 { 
public: 
    template<class TypeName1> TypeName1* method1() const {return 0;} 
}; 

struct Type1{}; 
struct Type2{}; 

class Class2 { 
public: 
    template<typename TypeName1, typename TypeName2> 
    int method2() { 
     Class1<TypeName2> c; 
     c.method1<TypeName1>(); 
     return 0; 
    } 

    int method1() { 
     return method2<Type1, Type2>(); 
    } 
}; 

int 
main() { 
    Class2 c; 
    return c.method1(); 
} 

codepad에서 컴파일러로 컴파일 할 때 다음 오류 :

t.cpp: In member function 'int Class2::method2()': Line 15: error: expected primary-expression before '>' token compilation terminated due to -Wfatal-errors.

불쾌한 줄은 템플릿 멤버 함수 :

c.method1<TypeName1>(); 

답변

11

당신은 당신이 멤버 함수 템플릿을 호출하는 template 키워드를 사용해야합니다 당신은 따라 이름이, 또는 method1는 "적은으로 c<의 멤버 변수로 해석됩니다 "보다 기호 :

c.template method1<TypeName1>(); 

@DrewDormann 올바르게 지적으로, template 키워드가 필요한 이유는 Class1 클래스 템플릿의 전문화, 특정 유형의 인수에 대해 제공 존재할 수입니다 method1은 함수 템플릿이 아닌 멤버 변수로 정의됩니다. 따라서 컴파일러는 함수 템플릿의 이름으로 method1을 구문 분석하도록 명시 적으로 지시해야합니다. 그렇지 않은 경우 함수 템플릿의 이름으로 명시해야합니다.

+0

좋은 답변입니다. 끔찍한 언어. –

+0

매력처럼 작용하여 5 분 안에 받아 들일 것입니다! –

+2

+1. 특히이 문맥에서 'Class1'이 forward-declared 인 경우에도'Class1 :: method1'이 템플릿 함수라고 가정 할 수 없습니다. Class1의 템플릿 전문화는 다른 곳에서 증명 될 수 있습니다. –

관련 문제