2012-05-18 4 views
0

다음은 컴파일되지 않는 이유는 무엇입니까 (MSVC10 -하지만 C++이 유효하지 않다고 생각합니다), 해결 방법이 있습니까?클래스 멤버 변수의 유형으로 템플릿 클래스의 멤버 유형 사용

template <typename M> 
struct MyClass 
{ 
    typedef std::vector<M>::iterator iteratorT; 

    iteratorT myIterator; 

}; 

오류는 error C2146: syntax error : missing ';' before identifier 'iteratorT'입니다. 동일한 결과를 얻으려는 다양한 변형을 시도했습니다. std::vector<M>::iterator을 멤버 함수의 유형으로 사용할 수 있지만 멤버 변수의 유형으로 사용할 수는 없습니다.

+0

자주 묻는 질문입니다. http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 – AnT

+0

감사합니다. 답변을 찾기 위해 무엇을 검색해야할지 몰랐습니다! – Zero

답변

4

typename의 사례입니다. 짧은 대답 대신이 작업을 수행 할 필요가 :

typedef typename std::vector<M>::iterator iteratorT; 

긴 대답, 컴파일러는 std::vector<M>::iterator 아무것도 할 수있다 M 등으로 확인 알고하지 않고, 그것을 위해 std::vector의 전문성이있을 수 있습니다. 특히 std::vector<M>::iterator이 유형 또는 값인지 여부를 알 수 없으며 해당 값을 믿는 것입니다. typename을 삽입하여 명시 적으로 컴파일러에 유형을 알려줘야합니다.

+0

D' oh! 바보 같은 순간. 나는'typename'을 필요로하지 않고 MSVC에 익숙해 져서'gcc' 문제로 생각하는 경향이 있습니다! – Zero

+0

@ Zero : 예, MSVC가 2 단계 템플릿 조회를 올바르게 구현하지 않는다는 것은 매우 불행합니다. –

관련 문제