模板父类方法调用

时间:2015-02-16 00:52:07

标签: c++ templates

我的情况看起来像这样:

template<typename T>
class BaseClass1
{
public:
    virtual void foo() = 0;
};

class ChildClass1 : public BaseClass1<int>
{
public:
    void foo() override
    {
        // do stuff
    };
};

template<typename T>
class BaseClass2 : public BaseClass1<T>
{
public:
    virtual void foo() = 0;
};

class ChildClass2 : BaseClass2<int>
{
public:
    void foo() override
    {
        // call ChildClass1::foo()
        BaseClass1::foo();
    };
};

我的最终目标是能够在ChildClass2 :: foo()中调用ChildClass1 :: foo(),但我明显做错了。所有这些类都在它们自己的头文件中定义,以及它们的所有方法定义。

然后我有一个文件,我试图实例化ChildClass2。它看起来像这样:

#include "ChildClass1.hpp"
#include "ChildClass2.hpp"

ChildClass2 obj;
obj.foo();

当我尝试编译时,出现链接错误:

  

[...]未解析的外部符号&#34; public:virtual void __thiscall BaseClass1 :: foo(void)&#34; [...]函数&#34; public:virtual void __thiscall ChildClass2 :: foo(void)&#34;

如果我以错误的方式解决问题,有人能告诉我我在这里做错了什么,和/或更好的方法来实现我的目标吗?此外,如果有人能想到一个更具描述性的标题可能会很好!感谢。

2 个答案:

答案 0 :(得分:0)

我认为你的代码可以做你想要的。 首先,你不能在ChildClass2 :: foo()中调用BaseClass1 :: foo(),因为BaseClass1 :: foo()是纯虚函数。

其次,你的ChildClass2是BaseClass1的子节点,与ChildClass1相同,所以这两个类没有父子关系,你不能在没有对象的情况下调用一个函数

答案 1 :(得分:-1)

您的ChildClass2::foo方法调用未定义的BaseClass1::foo。提供BaseClass1::foo的定义或不在ChildClass2::foo中引用它,您不应该遇到此问题。