为不明确的重载函数调用创建默认值

Posted

技术标签:

【中文标题】为不明确的重载函数调用创建默认值【英文标题】:Creating a Default for ambiguous overloaded function call 【发布时间】:2017-08-31 02:44:51 【问题描述】:

我有一个具有重载方法的类。某个子类继承了这两种类型。是否可以设置一个默认的方法调用来避免调用static_cast<class>(obj)

struct A ;
struct B 

   void foo(const A) 
     /*impl*/
    

   void foo(const B) 
     /*impl*/
   
;

struct C : A, B 

;

int main() 
    C c; 
    B b;
    b.foo(c); //ambiguous 

有没有办法让编译器默认调用某个方法?

*接受聪明/优雅的变通方法。

【问题讨论】:

如何声明void foo(const C) 以便调用默认值? 抱歉,foo 是来自超类的方法调用,而 C 是子类。我将编辑我的问题以展示这一点。 也许在发布之前尝试编译您的示例。有很多语法错误,现在问题很混乱,因为如果 foo 是成员函数,就不能这样调用。 好的,修好了。 【参考方案1】:

您可以使用模板为您执行static_cast,然后调用默认值:

struct A ;
struct B 

    template<typename T>
    void foo(T& t) 
        foo(static_cast<A&>(t));
    

    void foo(const A) 
        /*impl*/
    

    void foo(const B) 
        /*impl*/
    
;

struct C : A, B 

;

int main() 
    C c;
    B b;
    b.foo(c); //eventually calls foo(A)

但话说回来,声明一个接受C 的成员函数可能更容易。

【讨论】:

被选为最佳解决方案。没有意识到您可以在不使用菱形括号的情况下以这种方式使用模板。我正在编写一个数学库(带有运算符),因此不需要 static_cast 或 对于干净的符号目的来说非常棒。谢谢

以上是关于为不明确的重载函数调用创建默认值的主要内容,如果未能解决你的问题,请参考以下文章

C++函数默认值与函数重载

重载的函数调用 double 是不明确的

C++ 函数重载 参数默认值可以不写

对重载函数的调用不明确sqrt的解决方案

为啥这些重载的函数调用模棱两可?

面向对象程序设计-C++_课时17函数重载和默认参数