对class_name<template_argument>function_name(变量)的未定义引用?

Undefined reference to class_name<template_argument>function_name(variable)?

本文关键字:name 变量 引用 未定义 argument lt class template gt function      更新时间:2023-10-16

我在下面的代码中遇到了一个致命的链接错误,它说:

]+0x10)||undefined reference to `base<node>::pass_derived(node)'|

我想定义一个base类,它有一个名为poly_type的指针,而base类也可以从它自己内部"访问"另一个称为derived的类。我遇到的问题是第poly_type->pass_derived(n);行,编译器不想看到我试图传递node类型对象的派生类。我猜这是C++的一个限制,如果是的话,请告诉我。这是损坏的代码,

edit这似乎是在其他地方问的,我更新了来源以反映这一观点。

基类中没有pass_deriven的定义。您将其声明为虚拟函数,但仅在派生类中定义它。因为它在主函数中实例化了base,所以编译器试图为base生成代码,但找不到pass_deriven的定义。

您可以添加一个默认实现,即使它只是空的。

至于你最终是否可以让它调用派生的::pass_derived…:)祝你好运,看起来很有趣。你正在构建自己的继承版本?

问题就在这里:

template < class T>
class base
{
    // ...
    virtual void pass_derived(T data);
};

您将pass_derived声明为virtual,但不是纯virtual。因此,如果不提供实现,链接器将引发错误。

要么你提供一个实现,要么(我相信这是你的意图)你宣布它是纯virtual:

    virtual void pass_derived(T data) = 0;

但是不能实例化base<T>,并且必须仅使用指向base的指针或引用(实际上指向/引用derived)。