不同名称空间

时间:2015-05-22 15:39:48

标签: c++ templates c++11 visual-c++ gcc

命名空间中有一个模板类

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),任何命名空间   从其封闭的命名空间集。

这是编译器错误还是我误解了?

1 个答案:

答案 0 :(得分:7)

这是编译器错误,still present in HEAD。请报告。 Clang提供了更清晰的诊断:

  

错误:无法在此处定义或重新声明'bar'因为命名空间'O'   没有包含命名空间'Foo'

const int Baz::bar = 1;
          ~~~~~^