【问题标题】: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;
}

【问题讨论】:

    标签: c++ templates scope nested


    【解决方案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 一个成员变量是不是真的没有意义?
    • 是的,但这并不一定有帮助,因为有一些关于编译器如何解析模板的细节。请参阅此问题的公认答案:stackoverflow.com/questions/642229/…
    • 我还发现this answer 在第一次遇到这个错误和概念时非常有帮助。
    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多