无法在模板参数中编译非重载函数

时间:2015-05-06 15:27:29

标签: c++ templates overloading derived-class

我有这四个课程:

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)',它会编译。因此,问题似乎来自于存在具有相同名称的不同方法。

1 个答案:

答案 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;
};