在多个基类之间重载成员函数
Overloading member function among multiple base classes
基本上我想要有多个同名但不同签名的成员函数,分布在多个基类。
示例:
#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; }
为什么会模棱两可?即使参数数量不同,我也会得到相同的错误。
是否有任何解决方法来获得类似的行为?
在派生的 class 中使用 using
声明 - 它会解决您的问题。它使重载可见和都可以参与决议。
struct C : A, B {
using A::print;
using B::print;
};
回答一下为什么这个是模棱两可的:其实不是可见性,而是无法参与重载决议,由于未在同一范围内定义。 using
声明将这些方法拉入 C
范围,因此它们都成为有效的重载解析选项。
感谢 @Pete Becker 参与这个回答并几乎创建了这个段落。
基本上我想要有多个同名但不同签名的成员函数,分布在多个基类。
示例:
#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; }
为什么会模棱两可?即使参数数量不同,我也会得到相同的错误。
是否有任何解决方法来获得类似的行为?
在派生的 class 中使用 using
声明 - 它会解决您的问题。它使重载可见和都可以参与决议。
struct C : A, B {
using A::print;
using B::print;
};
回答一下为什么这个是模棱两可的:其实不是可见性,而是无法参与重载决议,由于未在同一范围内定义。 using
声明将这些方法拉入 C
范围,因此它们都成为有效的重载解析选项。
感谢 @Pete Becker 参与这个回答并几乎创建了这个段落。