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

时间:2013-12-05 21:51:19

标签: c++ visual-studio-2010 templates

当我有一个与命名空间同名的类时,它包含在(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;
}

3 个答案:

答案 0 :(得分:1)

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

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

当MS VC ++编译代码时没有错误。

答案 1 :(得分:0)

类和命名空间名称可能会在中发生冲突!不要使用与其包含名称空间名称相同的类名 我实际上没有关于这应该如何表现的标准引用,但经历了这么多次。它似乎是依赖于编译器实现的行为。

答案 2 :(得分:0)

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

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