C++ &引用;“非模板”的模板定义;使用嵌套模板时出错

C++ &引用;“非模板”的模板定义;使用嵌套模板时出错,c++,templates,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<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;
模板结构A
{
模板结构B
{
静态常量无符号val;
};
};
模板
模板
常量未签名A::模板B::val;
这是给我的错误

template definition of non-template ‘const unsigned int A<T>::B<U>::val’
const unsigned A<T>::template B<U>::val;
非模板“const unsigned int A::B::val”的模板定义 常量未签名A::模板B::val; 我无法找到语法的确切错误。

更改为:

template<typename T>
template<typename U>
const unsigned A<T>::B<U>::val;
模板
模板
常量无符号A::B::val;

您需要在定义中删除
模板。象征
B
至少在标准的意义上是不相关的; 它是一个本地声明的名称,因为它是在 模板
A
。见§14.6:

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

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

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

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


从最后一行删除“模板”可以修复它。但我不想回答这个问题,因为我不知道为什么:史坦克斯,这才是关键。我想这不是正确的上下文来使用这个关键词,我想是的。不过,B看起来确实像一个依赖类型模板…谢谢。你知道为什么“模板”关键字在那里是无效的吗?B是从属模板。