使用嵌套模板时出现"template definition of non-template"错误

"template definition of non-template" error while using nested templates

本文关键字:template definition of 错误 non-template 嵌套      更新时间:2023-10-16

我试图有一个嵌套的模板结构与静态变量里面。我已经将我的代码简化为这个简单的示例。

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;
我不知道语法到底出了什么问题。

您需要在定义中删除template。符号B是不相关的,至少在标准的意义上;它是一个局部声明的名称,因为它是在模板A。看到§14.6:

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

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

-依赖于模板参数的名称(14.6.2)。

-在模板定义中可见的作用域的名称。

改成:

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