使用嵌套模板时出现“非模板的模板定义”错误

时间:2014-07-03 07:48:48

标签: c++ templates

我正在尝试使用内置静态变量的嵌套模板结构。我把代码缩减到了这个准确的例子。

template<typename T> struct A
{
    template<typename U> struct B
    {
        static const unsigned val;
    };
};

template<typename T>
template<typename U>
const unsigned A<T>::template B<U>::val;

这给了我错误

template definition of non-template ‘const unsigned int A<T>::B<U>::val’
const unsigned A<T>::template B<U>::val;

我无法找到语法的确切错误。

2 个答案:

答案 0 :(得分:1)

您需要删除定义中的template。符号 B并非依赖,至少在标准意义上; 它是一个本地声明的名称,因为它是在 模板A。见§14.6:

  

模板定义中可以使用三种名称:

     

- 模板本身的名称,以及模板本身内声明的名称。

     

- 名称取决于模板参数(14.6.2)。

     

- 来自模板定义中可见范围的名称。

答案 1 :(得分:0)

更改为:

template<typename T>
template<typename U>
const unsigned A<T>::B<U>::val;