【发布时间】: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<T>::work() 并让它工作。
现在我有一个 Grandson 类,它想要覆盖 work 函数。但是覆盖不像Child<T>::call那样工作,我已经明确指定调用Base<T>::work()。那么实现Child<T>::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->work();而不是Base<T>::work()呢? -
不敢相信我什至没有尝试过这个。我一定假设
work()总是等价于this->work()。如果您可以发布答案,我会接受。顺便说一句,我不清楚错误的含义。如果您能帮助我,将不胜感激。 -
你也试过Base::work()吗?我认为这只是因为您不应该模板化调用
标签: c++ templates inheritance