命名空间 X 中具有类 X 的模板类 Y 无法在 VS2010 中编译
Template class Y in namespace X with class X can't compile in VS2010
当我有一个与(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()
{
}
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 如何使用VS2010编译Windows X64位的Leptonica库
- VS2010在尝试编译基本JNI测试代码时出错
- 依赖VS2010中静态编译的库时未定义的符号
- 命名空间 X 中具有类 X 的模板类 Y 无法在 VS2010 中编译
- 在VS2010中编译需要太长时间
- 在VS2010调试模式下启用多核编译
- 模板编译:gcc vs VS2010
- 使用 VS2010 在客户端中编译本机 COM 客户端存根
- CBLAS_ORDER不是带有gcc的类或命名空间,但在VS2010(英特尔C++)中编译良好
- VS2010:用64位编译C++项目
- 在编译的形式中抛出系统访问冲突,但在VS2010中没有.原因
- VS2010 错误 2259 和 lnk 2001 中的编译错误
- 使用msbuild在没有vs的计算机上编译由vs2010创建的vcxproject
- 在VS2010中编译c++ 11中的代码时,std::function()是否检查类型
- c++ VS2010将我的代码编译为几乎可读的代码
- 使用Microsoft VS2010编译Qwt
- 使用vs2010编译时模板重新定义错误
- visual studio 2010-C++VS2010编译选项
- 当我使用 VS2013 编译时,链接到使用 VS2010 编译的静态 .lib?