在模板化类中使用嵌套嵌套类时,“依赖名称不是类型”

时间:2018-03-12 01:19:37

标签: c++ templates visual-c++ compiler-errors

有谁知道为什么以下无法编译(在MSVC2015中测试过)?

template<int N> // when this line is removed it compiles successfully
class A {
    class B {
    public:
        class C {
        };
    };
    void func(B b){} // compiles fine
    void func(B::C c){} // generates warning C4346 and error C2061
};

它在标有注释的行上生成以下内容:

  • warning C4346: 'A<N>::B::C': dependent name is not a type
  • error C2061: syntax error: identifier 'C'

1 个答案:

答案 0 :(得分:0)

让我们为你辩护。

  

如果要将依赖名称视为类型,则typename关键字为requiretd。

C ++规则。

  

14.6名称解析

     

模板声明或定义中使用的名称以及依赖在模板参数上的名称被假定为不命名类型,除非适用的名称查找包含类型名称或名称由以下属性限定:关键字typename