基本上,我希望具有多个名称相同但签名不同的成员函数,并散布在多个基类中。
示例:
#include <iostream>
struct A
{
void print(int) { std::cout << "Got an int!" << std::endl; }
};
struct B
{
void print(double) { std::cout << "Got a double!" << std::endl; }
};
struct C : A, B {};
int main()
{
C c;
c.print((int)0);
return 0;
};
但是我在clang上遇到了这个错误:
main.cpp:18:7: error: member 'print' found in multiple base classes of different types
c.print((int)0);
^
main.cpp:5:10: note: member found by ambiguous name lookup
void print(int) { std::cout << "Got an int!" << std::endl; }
^
main.cpp:10:10: note: member found by ambiguous name lookup
void print(double) { std::cout << "Got a double!" << std::endl; }
为什么模棱两可?即使使用不同数量的参数,我也会遇到相同的错误。
是否有任何变通方法来获得类似的行为?
答案 0 :(得分:4)
在派生类中使用using
声明-这样可以解决您的问题。它使重载 visible和都可以参与决议。
struct C : A, B {
using A::print;
using B::print;
};
要回答为什么这是模棱两可的:实际上,这与 visibility 无关,而是与参加重载决议有关,原因是未在相同的定义中定义范围。 using
指令将这些方法拉到C
范围内,因此它们都成为有效的重载解决方案选项。
感谢 @Pete Becker 参与了此答案,并为此创建了一段段落。