종속 범위가있는 중첩 템플릿


79

종속 범위는 무엇이며 다음 오류의 맥락에서 typename의 의미는 무엇입니까?

$ make
g++ -std=gnu++0x main.cpp
main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope
make: *** [all] Error 1


/*
 * main.cpp
 */

#include <vector>
#include <memory>

template<typename T>
struct ptrModel
{
 typedef std::unique_ptr<T> Type;
};


template<typename Data>
struct ptrType
{
 typedef ptrModel< std::vector<Data> >::Type Type;
};

int main()
{
 return 0;
}

답변:


124

컴파일러가 정확히 무엇을해야하는지 알려줍니다. 다음 과 같이 typename전에 작성하십시오 ptrModel<std::vector<Data> >::Type.

 typedef typename ptrModel<std::vector<Data> >::Type Type;

이 요구 사항 의 이유 는 컴파일러가이 시점 ptrModel<std::vector<Data> >::Type에서 멤버 변수 또는 중첩 형식을 설명 하는지 여부를 알지 못하기 때문 입니다. 프로그램의 다른 곳에 for ptrModelptrModel대한 전문화가있을 수 있기 때문에 정의를 보면 알 수 std::vector<Data>없습니다.::Type 가리키는 지 . 따라서 명시 적으로 알려야합니다.

이름 ptrModel<std::vector<Data> >::Type은 템플릿의 인스턴스화에 의존 하는 범위에 있기 때문에 "종속 범위"를 갖습니다 .


6
좋아,하지만 멤버 변수를 typedef하는 것이 이치에 맞지 않습니까?
user383352 2010-07-22

5
예, 그러나 컴파일러가 템플릿을 구문 분석하는 방법에 대한 세부 정보 때문에 반드시 도움이되는 것은 아닙니다. :이 질문에 대한 허용 대답을 참조하십시오 stackoverflow.com/questions/642229/...
타일러 맥 헨리

5
또한 이 오류와 개념을 처음 접할 때이 답변 이 매우 유용 하다는 것을 알았 습니다.
Drew Noakes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.