具有依赖范围的嵌套模板

Posted

技术标签:

【中文标题】具有依赖范围的嵌套模板【英文标题】:Nested templates with dependent scope 【发布时间】:2011-03-19 16:55:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

编译器准确地告诉了你要做什么。在ptrModel&lt;std::vector&lt;Data&gt; &gt;::Type之前写typename,像这样:

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

此要求的原因是编译器此时不知道ptrModel&lt;std::vector&lt;Data&gt; &gt;::Type 是描述成员变量还是嵌套类型。它甚至无法通过查看ptrModel 的定义来弄清楚这一点,因为在程序中的其他地方可能存在ptrModel 的专用化std::vector&lt;Data&gt;,它尚未到达这会改变这些事情中的哪一个::Type 指。所以你需要明确地告诉它。

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

【讨论】:

好吧,但是 typedef 一个成员变量是不是真的没有意义? 是的,但这并不一定有帮助,因为有一些关于编译器如何解析模板的细节。请参阅此问题的公认答案:***.com/questions/642229/… 我还发现this answer 在第一次遇到这个错误和概念时非常有帮助。

以上是关于具有依赖范围的嵌套模板的主要内容,如果未能解决你的问题,请参考以下文章