2012-10-02 2 views
1

문제는 다음과 같습니다. 다음 테스트에서는 엄청난 양의 컴파일러 오류가 발생합니다.템플릿 기능에서 벡터를 반환하려고하면 컴파일 오류가 발생합니다.

#include <vector> 
using namespace std; 

template<class T> 
class test{ 
    vector<T> vec; 
public: 
    vector<T>::iterator begin(); 

}; 

template<class T> 
vector<T>::iterator test<T>::begin(){ 
    return vec.begin(); 
} 

int main(){ 

    test<float> testing; 
    testing.begin(); 

} 

일부 컴파일러 오류 : 그러나

test.cpp(8): warning C4346: 'std::vector<T>::iterator' : dependent name is not a type 
test.cpp(8): error C2146: syntax error : missing ';' before identifier 'begin' 
test.cpp(13): error C2143: syntax error : missing ';' before 'test<T>::begin' 

, 당신이 말에 대한 템플릿 vector<T>을 교체하는 경우, vector<float>의 컴파일 잘. 예 :

template<class T> 
class test{ 
    vector<T> vec; 
public: 
    vector<float>::iterator begin(); 

}; 

template<class T> 
vector<float>::iterator test<T>::begin(){ 
    return vec.begin(); 
} 

이유는 무엇입니까?

template<class T> 
class test{ 
    vector<T> vec; 
public: 
    typename vector<T>::iterator begin(); 

}; 

template<class T> 
typename vector<T>::iterator test<T>::begin(){ 
    return vec.begin(); 
} 

답변

2

당신은 두 곳에서 typename을 추가해야합니다 typename을 추가함으로써

typename vector<T>::iterator begin(); 

typename vector<T>::iterator test<T>::begin() 

, 당신은 컴파일러 코드를 해석하는 방법 을 말하고있다. 기본적으로 typename을 추가함으로써 컴파일러에서 선언을 유형으로 구문 분석하도록 지시합니다.

자세한 내용은 Where and why do I have to put the “template” and “typename” keywords?을 참조하십시오.

1

당신은 vector<T>::iterator이 범위의 데이터 나 기능 멤버 스코프 유형을 언급하고 있지 않은지 구별하기 위해 typename 키워드를 사용해야합니다 템플릿 매개 변수가 클래스 외부에 존재하지 않기 때문에 클래스 내부에서 정의됩니다. 마지막 두 가지 오류는 익숙하지 않은 컨텍스트에서 완벽하게 유효한 구문을 잘못 해석 할 때 컴파일러에서 생성되는 것과 같습니다. 함수 본문을 클래스 내부로 옮겨보십시오.

+0

* * 멤버 * 멤버 변수가 아닌 * 멤버 * 유형 *입니다. –

+0

@KerrekSB : 고침, 고마워. – jxh

-2

C++에서 템플릿 클래스, 템플릿 멤버 함수가 자신의 신체가 있어야합니다

+0

사실이 아닙니다. 템플리트의 정의는 템플리트가 인스턴스화되는 곳에서 볼 수 있어야하지만 클래스 선언 내부에있을 필요는 없습니다. – jmk

+0

죄송합니다. 템플릿을 여러 파일로 분할하려고합니다. 내 잘못이야. – ValekHalfHeart

+0

걱정할 필요는 없으며 아무도 혼란스러워하지 않도록 명확히하고 싶었습니다. 그래도 명확하게 대답을 편집/삭제하고 싶을 수도 있습니다. – jmk

관련 문제