命名空间 X 中具有类 X 的模板类 Y 无法在 VS2010 中编译

Template class Y in namespace X with class X can't compile in VS2010

本文关键字:VS2010 编译 命名空间      更新时间:2023-10-16

当我有一个与(A::A)中包含的命名空间同名的类,然后在同一命名空间中定义一个模板化类时,如果并且仅当我使用范围解析运算符(A::B<type>::...)在命名空间之外定义模板化类的函数时,编译失败。这是在Visual studio 2010中。当我在http://ideone.com/以下两种情况都适用。

有人能解释为什么会发生这种情况吗?

namespace A
{
    template<typename type>
    class B
    {
    public:
        B();
    };
    class A
    {
    };  
}
/* 1. Doing this works
namespace A
{
    template<typename type>
    B<type>::B()
    {
    }
}
*/
/* 2. error C2039: 'B' : is not a member of 'A::A'
template<typename type>
A::B<type>::B()
{
}
*/
int main()
{
    A::B<int> test;
}

这是一个编译器错误。如果您将以以下方式定义构造函数

template<typename type>
::A::B<type>::B()
{
}

当MS VC++编译代码时不会出现错误。

类和命名空间名称在c++中可能发生冲突!不要使用与包含命名空间名称相同的类名
实际上,我没有标准的例子来说明这应该如何表现,但我经历过很多次。这似乎是编译器实现相关的行为。

它看起来像一个bug。您可以使用Visual C++以以下方式编译代码2:

template<typename type>
::A::B<type>::B()
{
}