具有依赖范围的嵌套模板

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 在第一次遇到这个错误和概念时非常有帮助。

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

Python:动态嵌套for循环,每个循环具有不同的范围

具有嵌套关联条件检查的has_many范围

具有范围限定符的模板语法的含义

为啥允许使用泛型 lambda 而不允许使用带有模板化方法的嵌套结构?

取消嵌套命中和取消嵌套会话范围的自定义维度 BigQuery 代码过滤器

具有依赖项的 Maven 2 程序集:不包括范围“系统”下的 jar