当我有一个与命名空间同名的类时,它包含在(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;
}
答案 0 :(得分:1)
这是编译器错误。如果您将按以下方式定义构造函数
template<typename type>
::A::B<type>::B()
{
}
当MS VC ++编译代码时没有错误。
答案 1 :(得分:0)
类和命名空间名称可能会在c++中发生冲突!不要使用与其包含名称空间名称相同的类名 我实际上没有关于这应该如何表现的标准引用,但经历了这么多次。它似乎是依赖于编译器实现的行为。
答案 2 :(得分:0)
它看起来像一个bug。您可以使用Visual C ++以下列方式编译代码2:
template<typename type>
::A::B<type>::B()
{
}