具有依赖范围的嵌套模板

在以下错误的上下文中,什么是依赖范围,什么是类型名的含义?

$ 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;
}
39717 次浏览

编译器告诉你要做什么。在 ptrModel<std::vector<Data> >::Type之前写 typename,像这样:

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

此需求的 原因是编译器此时不知道 ptrModel<std::vector<Data> >::Type描述的是成员变量还是嵌套类型。它甚至不能通过查看 ptrModel的定义来得出这个结论,因为在程序中的其他地方可能存在 ptrModel对于 std::vector<Data>的专门化,但是它还没有得到 ::Type所指的这些东西中的哪一个发生了变化。所以你需要明确地说出来。

名称 ptrModel<std::vector<Data> >::Type有一个“依赖作用域”,因为它位于 看情况对模板进行实例化的作用域中。