命名空间中有一个模板类
namespace N
{
template <typename T>
class Foo {
static const T bar;
};
}
在不同命名空间中的专业化:
namespace O
{
typedef N::Foo<int> Baz;
template<>
const int Baz::bar = 1;
}
此代码使用gcc(4.9.2)编译,但无法使用msvc(v120)进行编译:
error C2888: 'const int N::Foo<int>::bar' : symbol cannot be defined within namespace 'O'
如果我理解正确,代码不符合C ++ 11:
应在包含。的命名空间中声明显式特化 专业模板。显式特化,其声明者身份 不合格的,应在最近的封闭命名空间中声明 的模板,或者,如果命名空间是内联(7.3.1),任何命名空间 从其封闭的命名空间集。
这是编译器错误还是我误解了?
答案 0 :(得分:7)
这是编译器错误,still present in HEAD。请报告。 Clang提供了更清晰的诊断:
错误:无法在此处定义或重新声明'bar'因为命名空间'O' 没有包含命名空间'Foo'
const int Baz::bar = 1; ~~~~~^