依赖范围的嵌套模板
什么是依赖范围,在下面的错误的上下文中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
具有“依赖范围”,因为它位于依赖于模板实例的范围内。