2

我遇到了一些代码片段,一个类可以通过其模板参数从另一个类继承。但是,我不明白为什么我需要usingstruct D. 我尝试调用的say_hi()函数,derror: request for member ‘say_hi’ is ambiguous如果我有这using三行,它会声明并且错误消失了。谁能告诉我为什么?

struct C1 {
  void say_hi(int) { puts("int hi"); }
};
struct C2 {
  void say_hi(char) { puts("char hi"); }
};
struct C3 {
  void say_hi(double) { puts("double hi"); }
};
template<typename T, typename U, typename V>
struct D : T, U, V { 
  using T::say_hi;
  using U::say_hi;
  using V::say_hi;
};
D<C1, C2, C3> d;
4

1 回答 1

3

这是隐藏规则在 c++ 中如何工作的一个变体:https ://isocpp.org/wiki/faq/strange-inheritance#hiding-rule 。但是您实际上没有在 D 中声明任何可能重载基类方法的方法。C++ 编译器不会在整个继承树中搜索函数调用的所有可能重载,而是在找到正确的重载时停止(遵守标准)。要修改编译器的基本工作,您可以添加using声明以指定哪些重载应该可见或解决歧义。

于 2021-08-15T09:10:19.340 回答