【问题标题】:When using template and inheritance together, I do not know how to override a member function一起使用模板和继承时,不知道如何覆盖成员函数
【发布时间】:2021-02-10 02:59:40
【问题描述】:

我有以下混合模板和继承的代码。

Base 类具有一些用于构建项目的实用函数(示例代码中的 work),Child 在其 API 的实现中调用 work call

在这个函数中

virtual void call() override {
        Base<T>::work(); // Problem Here
        // work();
}

我尝试拨打work(),但收到以下错误:

test.cc: In member function ‘virtual void Child<T>::call()’:
test.cc:18:2: error: there are no arguments to ‘work’ that depend on a template parameter, so a declaration of ‘work’ must be available [-fpermissive]

所以我写了Base&lt;T&gt;::work() 并让它工作。

现在我有一个 Grandson 类,它想要覆盖 work 函数。但是覆盖不像Child&lt;T&gt;::call那样工作,我已经明确指定调用Base&lt;T&gt;::work()。那么实现Child&lt;T&gt;::call 以使Grandson 中的覆盖起作用的正确方法是什么?

#include <iostream>

template <typename T>
class Base {
protected:
    virtual void work() {
        T a;
        std::cout << "From Base" << '\n';
    }
public:
    virtual void call() = 0;
};

template <typename T>
class Child : public Base<T> {
public:
    virtual void call() override {
        Base<T>::work(); // Problem Here
        // work();
    }
};

template <typename T>
class Grandson : public Child<T> {
        protected:
                void work() override {
                        std::cout << "From Grandson" << '\n';
                }
};

int main() {
        Grandson<int> g;
        g.call();
}

【问题讨论】:

  • 如果你写this-&gt;work();而不是Base&lt;T&gt;::work()呢?
  • 不敢相信我什至没有尝试过这个。我一定假设work() 总是等价于this-&gt;work()。如果您可以发布答案,我会接受。顺便说一句,我不清楚错误的含义。如果您能帮助我,将不胜感激。
  • 你也试过Base::work()吗?我认为这只是因为您不应该模板化调用

标签: c++ templates inheritance


【解决方案1】:

Base&lt;T&gt;::work() 替换为this-&gt;work()


当您是从依赖于模板参数的基类继承的模板类时,编译器在看到类似work() 的内容时不会查看您的基类。相反,您必须告诉它它需要这样做。我知道的最简单的方法是在调用前加上this-&gt;

至于为什么在你使用Base&lt;T&gt;::work()时它不起作用,我不完全确定。它是硬编码来调用基类实现的,但我相当确定有一个类似的语法可以工作。

【讨论】:

    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2011-01-10
    • 1970-01-01
    • 2020-01-10
    • 2012-03-13
    相关资源
    最近更新 更多