c++模板名称:在Visual Studio中编译错误,在gcc中工作正常
C++ Template names: compilation error in Visual Studio, works fine in gcc
使用Visual Studio Express 2012无法编译以下代码:
template< int d >
class MyVector
{
public:
typedef double X;
};
class Base
{
public:
int d;
int m() {
return 0;
}
};
template<int d>
class Derived1 : Base
{
typedef typename MyVector<d>::X X;
};
template<int m>
class Derived2 : Base
{
typedef typename MyVector<m>::X X;
};
我得到"错误C2327: 'Base::d':不是类型名称,静态或枚举器"在Derived1和"错误C2975: 'd': 'MyVector'的无效模板参数,预期的编译时常量表达式"在Derived2。
当然,很容易看出问题出在模板实参名称与Base成员名称冲突上。如果我将派生模板名改为
template<int ddd>
class Derived1 : Base
{
typedef typename MyVector<ddd>::X X;
};
template<int mmm>
class Derived2 : Base
{
typedef typename MyVector<mmm>::X X;
};
代码编译得很好。
但是,原始代码在Linux下使用gcc 4.6.4编译没有任何问题。所以我的问题是:根据标准,哪个编译器是正确的?我认为自己是c++模板的新手,但我的直觉倾向于gcc的解释:毕竟,如果Derived1希望访问基成员'd',它将需要标记'Base::d'或'this->d',所以我想在这种情况下不应该有名称冲突。
这是谁的错?
gcc 4.6.4
相对较老;接受代码片段是错误的。
Edit:在此编辑之前,声明4.6.4 "非常旧"。我错误地认为它是在2011年发布的,但实际上它是在2013年4月13日发布的。
《标准》怎么说?(n3337)
14.6.1p9
本地声明的名称[temp.local]
如果的定义类模板或模板等成员的定义出现在模板定义之外,每个基类不依赖于一个模板参数 (14.6.2)
[ Note: >> ]
如果基类的名称或基类成员的名字是一样的名称模板参数,基类名称或成员名隐藏了模板参数名称[ << --end note ]
(3.3.10)。
注释: c++ 03的相关和语义等效的措辞可以在14882:2003中的[temp.local]p7
中找到。
上面引用的部分的最后一句话说,如果模板参数的名称与非依赖基中的名称相同,则成员名将有效地隐藏模板参数。
在gcc
的新版本中该错误已经修复。
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译