【发布时间】:2013-12-18 22:04:39
【问题描述】:
我正在尝试找出失败的原因。我使用的代码基本上可以浓缩为我下面的内容。我有一个简单的 A 类,我专门用它来制作模板。模板不需要这个类型来编译它的构造函数,并且我实际调用的构造函数(派生类型)没有暴露出来,所以编译器此时无法生成构造函数的代码。
GCC 和 Clang 没有。但是,MSVC (2008 + 2010) 确实尝试编译虚拟成员,因此无法编译。
这是 GCC 和 Clang 的错误,还是 MSVC 的错误?还是我正在进入 UB 领域?
class A;
template <typename X>
class S {
public:
S() {}
virtual int useX() { return X::value; }
};
class T : public S<A> {
public:
T();
};
int main()
{
new T();
return 0;
}
【问题讨论】:
-
[temp.inst]/10 “如果虚拟成员函数不会被实例化,则未指定实现是否隐式实例化类模板的虚拟成员函数。”
-
“实现”是什么意思?
-
C++ 标准的实现,即编译器(+链接器)+标准库。
标签: c++ templates visual-c++ gcc