C++ 命名空间X中带有类X的模板类Y可以';t在VS2010中编译

C++ 命名空间X中带有类X的模板类Y可以';t在VS2010中编译,c++,visual-studio-2010,templates,C++,Visual Studio 2010,Templates,当我有一个与它所包含的名称空间同名的类(a::a),然后在同一名称空间中定义一个模板类时,如果并且仅当我使用范围解析操作符(a::B::…)在名称空间之外定义模板类的函数时,编译才会失败。这是在VisualStudio2010中。当我编译代码时,它在下面两种情况下都能工作 有人能解释为什么会发生这种情况吗 namespace A { template<typename type> class B { public: B(); }

当我有一个与它所包含的名称空间同名的类(
a::a
),然后在同一名称空间中定义一个模板类时,如果并且仅当我使用范围解析操作符(
a::B::…
)在名称空间之外定义模板类的函数时,编译才会失败。这是在VisualStudio2010中。当我编译代码时,它在下面两种情况下都能工作

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

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;
}
名称空间A
{
模板
B类
{
公众:
B();
};
甲级
{
};  
}
/* 1. 这样做有效
名称空间A
{
模板
B::B()
{
}
}
*/
/* 2. 错误C2039:“B”:不是“a::a”的成员
模板
A::B::B()
{
}
*/
int main()
{
A::B试验;
}

类和名称空间名称可能会发生冲突!不要使用与其包含命名空间同名的类名。

实际上,我手头没有关于这应该如何表现的标准引用,但我经历了很多次。这似乎是编译器实现相关的行为。

它看起来像一个bug。你可以用VisualC++来编译代码2:
template<typename type>
::A::B<type>::B()
{
}
模板
::A::B::B()
{
}

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

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

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

#2在我的Mac电脑上与clang 3.3配合使用,仅供参考。如果您碰巧手头有VS2012或更高版本,我很想知道这是否是2012年11月后的CTP地址。@WhozCraig也适用于gcc 4.3.2,但肯定记得有相同的错误。。。