我知道函数调用中存在歧义。有没有一种方法可以调用foo()函数?

时间:2018-10-27 14:07:48

标签: c++

childs = childs.reduce((acc, val) => acc.concat(val), [])

3 个答案:

答案 0 :(得分:3)

没有干净的方法可以做到这一点,只有丑陋的方法。如:

static_cast<int (*)()>(&foo)();

或者:

int (*p)() = &foo;

(*p)();

最重要的是,由于模棱两可,您不能依赖重载解析。因此,您需要使用这种方法来明确地解析符号。

首选解决方案是首先避免模棱两可的重载。通常可以找到一些合理的方法来做到这一点,但这取决于实际的细节。

答案 1 :(得分:1)

您可以显式强制转换函数指针,但不确定是否应该这样做。

#include <iostream>

using namespace::std;

int foo();              //function with no argument
int foo(int=10);        //Default argument

int foo()
{
    cout<<"\n Foo , I am foo \n";
    return 0;
}

int foo(int f)
{
    cout<<"\n I am Foo too.\n";
    return 0;
}

int main()
{
    static_cast<int(*)()>(foo)();
    foo(2);
    cin.get();
    return 0;
}

编辑:

此行static_cast<int(*)()>(foo)();只是转换和调用函数的缩写形式。

为了说明这一点,我们可以分三步将其拆开:

将myFuncType定义为指向返回int并且不带参数的函数的指针

using myFuncType = int(*)();

通过将重载的名称foo强制转换为不带参数的函数类型,并将其存储在名为f的变量中来解决该问题

auto f = static_cast<myFuncType>(foo);
// or auto f = (myFuncType)foo;
// or auto f = (myFuncType)&foo; C++ actually does the address-of implicitly with functions

最后一个是调用函数指针

f(); //or (*f)(); C++ automatically dereferences function pointer on call, but you can also manually dereference

答案 2 :(得分:0)

  1. 删除默认参数,或
  2. 重命名功能之一

不清楚两个函数声明为何使用相同的名称。仅当他们应该“做同样的事情”时,才应该这样做。

删除默认参数

如果两个函数应该做相同的事情,则:

为函数指定默认参数时,会抛出一个额外的函数签名。因此,

int foo(int arg=10);

还给你

int foo();

它表示,对foo()进行 *任何调用“ ”时,arg的值为10

但是随后您又抛出了一个额外的int foo();并返回了0,这使编译器感到困惑。在更抽象的层次上,您实际上对您自己感到困惑,即默认参数是函数应该执行的“操作”。

重命名功能之一

如果两个函数不执行相同的操作,则它们不应具有相同的名称。有几种不同的方法可以做到这一点:

  • 给一个人改名
  • 将其中之一放入命名空间
  • 使用模板