依赖范围的嵌套模板

什么是依赖范围,在下面的错误的上下文中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; } 

编译器告诉你该怎么做。 在ptrModel<std::vector<Data> >::Type之前写入ptrModel<std::vector<Data> >::Type ,如下所示:

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

这个要求的原因是编译器此时不知道ptrModel<std::vector<Data> >::Type描述了一个成员variables还是一个嵌套types。 它甚至不能通过查看ptrModel的定义来解决ptrModel因为在程序中的某个地方可能存在专门的ptrModel ,它还没有得到,哪些改变了这些东西::Type是指。 所以你需要明确地告诉它。

名称ptrModel<std::vector<Data> >::Type具有“依赖范围”,因为它位于依赖于模板实例的范围内。