我有这四个课程:
class BaseWrapper {
public:
virtual void Process(int i) = 0;
};
template<typename T>
class Wrapper : public BaseWrapper {
public :
Wrapper(T * arg): var(arg) {}
void Process(int i) {
this->var->Process(i);
}
private:
T * var;
};
class Base {
public :
void Process(int) {}
};
class Derived : public Base {
public:
Derived() {
BaseWrapper * wrap = new Wrapper<Derived>(this);
}
void Process(std::string) {}
};
因此,基本上Derived类不会重载Process方法,并且包装器需要此方法。当我编译它时,我得到'没有匹配函数来调用Derived :: Process(int)'。
不应该在Derived类中定义Process方法吗?我也试过在Base虚拟中声明Process方法,它没有改变任何东西。
我不是在寻找一种解决方法(我通过重载Process方法并在其中调用父方法找到了一个)但我试图理解为什么这不能编译。
[编辑]:如果我从Derived中删除'void Process(std :: string)',它会编译。因此,问题似乎来自于存在具有相同名称的不同方法。
答案 0 :(得分:1)
如果你改变了这个:
void Process(std::string) {}
到此:
void Process(int) {}
你的代码将编译。这是强提示我的代码无法编译的原因。
让我们看看这里发生了什么:
我们有:
Derived() {
BaseWrapper * wrap = new Wrapper<Derived>(this);
}
将调用Wrapper
的构造函数,并将数组成员Wrapper
分配给Derived
类(数据成员是指针,但这不是什么大不了的事)。
现在,在Wrapper
课程内,我们有:
void Process(int i) {
this->var->Process(i);
}
这是问题所在。你看,在这个函数的主体中,我们说取Wrapper
的数据成员,它指向类Derived
并调用我们指向的类的Process()
!这是Derived
类,它有void Process(std::string)
,因此我们公平地收到此错误:
error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
this->var->Process(i);
类似于您收到的错误。
希望这有帮助! // + 1为我的一天提供了一个很好的启动问题:)
如果你不想重载函数,那么请帮助编译器说它应该检查从基类继承的方法,而不是Derived
类中定义的方法,这应该是第一选择对于编译器。
那么你的代码应该是这样的:
class Base; // forward declaration, or just define Base class here
template<typename T>
class Wrapper : public BaseWrapper {
public :
Wrapper(T * arg): var(arg) {}
void Process(int i) {
this->var->Base::Process(i); // Say that you want the Process() of Base
}
private:
T * var;
};