未定义的引用class_name <template_argument> function_name(variable)?</template_argument>

时间:2013-08-02 08:22:42

标签: c++ inheritance polymorphism undefined-reference

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

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

我想定义一个base类,它有一个名为poly_type的指针,base类也可以从另一个名为derived的类中“访问”。我遇到的问题是行poly_type->pass_derived(n);,其中编译器不希望看到我尝试传递类型node的对象的派生类。我猜这是C ++的限制,如果是这样,请告诉我。这是破碎的代码,

编辑似乎已经在其他地方询问了这一点,我更新了源代码以反映该意见。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

问题在于:

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)。