c++ - 在构造函数只需要前向声明的模板基类中的虚函数中使用前向声明的类?

标签 c++ templates visual-c++ gcc

我正在尝试找出失败的原因。我使用的代码基本上浓缩为下面的代码。我有一个简单的 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/

相关文章:

C++ - 我可以创建编译时变量对象吗?

c++ - 解释一下默认的priority_queue::top()的行为?

c++ - 给定一个带有 UnhandledExceptionFilter 的调用堆栈,导致我的应用程序崩溃的异常是什么?

visual-c++ - 使用带有/MT 标志的 MSVC 编译 jrtplib

c++ - Windows 标准库中的定义不可访问

C++ "No matching function for call"错误

C++ 模板 : intiantiating a variable out of a particular integer (as type)

c++ - 如何实现可选的模板参数?

c++ - 多模板参数引用循环

C++ ifstream读取2个字符数