我正在尝试找出失败的原因。我使用的代码基本上浓缩为下面的代码。我有一个简单的 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;
}
最佳答案
当 MSVC 实例化一个类时,它还会填充其 vtable 并为此目的实例化其所有虚函数,甚至是那些从未调用过的函数。
在您的情况下,如果编译器未看到 A 的完整定义,则无法实例化函数 useX
。
如果您将 useX 声明为非虚拟的,MSVC 可以正常工作。
似乎这种行为是依赖于编译器的;例如,AIX 在实例化(未使用的)函数方面甚至比 MSVC 更积极。
关于c++ - 在构造函数只需要前向声明的模板基类中的虚函数中使用前向声明的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669394/