【问题标题】:Member functions ambiguity with multiple inheritance templates多重继承模板的成员函数歧义
【发布时间】:2020-08-12 16:53:34
【问题描述】:

我公开将类模板“区域”的两个实例,一个 int 和另一个 char 派生到一个单独的类“矩形”中。

template<class T>
class Area {
  public:
    T a;
    T getArea() { return a; }
    void setArea(T t) { a = t; }
};  

class Rectangle : public Area<int>, public Area<char> {
};  

int main() {
  Rectangle a;
  a.setArea(1);
  std::cout << a.getArea() << std::endl;
  Rectangle b;
  b.setArea('c');
  std::cout << b.getArea() << std::endl;
}   

我发现 setArea 和 getArea 有歧义。为什么呢?我想在 public Area 之后, public Area 会有两个 setArea 的定义。首先,void setArea(int) 和另一个 void setArea(char)。如果我错了,请纠正我。如果我是正确的,为什么会模棱两可?

【问题讨论】:

  • @AzamBham 我已经尝试过使用语句。那是行不通的。 using 语句放在哪里?
  • 编译器无法自动推断您要调用的a.getArea() 版本。尝试帮助它:std::cout &lt;&lt; a.Area&lt;char&gt;::getArea() &lt;&lt; std::endl;
  • @MihaiTodor,感谢您回来。我也试过了,也没用。
  • 为我工作:ideone.com/0WaMIo

标签: c++ templates


【解决方案1】:

如果您使用 using 语句将名称 setArea 从两个基类带入派生类:

class Rectangle : public Area<int>, public Area<char> {
  using Area<int>::setArea;
  using Area<char>::setArea;
};  

编译器将能够正确调用setArea

这不适用于getArea,因为这两个函数仅在返回类型上有所不同。您必须在呼叫站点区分它们:

std::cout << a.Area<int>::getArea() << std::endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多