2个重载具有类似的转换

Pra*_*yot 9 c++

有人质疑这个C++函数重载类似转换的类似问题 ,我理解这个问题的一般前提.寻找解决方案.

我有2个重载函数:

virtual IDataStoreNode* OpenNode(const char *Name, bool bCreateIfNotExist,int debug=0) { return 0; 
}

virtual IDataStoreNode* OpenNode(const char* Name,int debug=0) const { return 0; }
Run Code Online (Sandbox Code Playgroud)

从错误中可以看出,bool和int不能用于区分函数重载.

问题是,有没有办法解决这个问题?

AnT*_*AnT 13

bool并且int 可以用来区分功能过载.正如人们所预料的那样,bool参数会更喜欢bool重载和int参数 - int重载.

通过错误消息来判断(我假设您的问题的标题是您收到的错误消息的一部分),您所处理的是当您提供的参数既不是boolint没有转换boolint存在并具有同等级.

例如,考虑一下

void foo(bool);
void foo(int);

int main() {
  foo(0);     // OK
  foo(false); // OK
  foo(0u);    // ERROR: ambiguous
}
Run Code Online (Sandbox Code Playgroud)

前两个调用将以预期的方式成功解决.第三个调用将无法解析,因为参数类型实际上是unsigned int,但它支持对两者的隐式转换bool,int从而使调用不明确.

你怎么称呼你的职能?向我们展示你想要传递的论据.


Igo*_*aka 5

对于以下功能:

virtual IDataStoreNode* OpenNode(const char *Name, bool bCreateIfNotExist,int debug=0) { return 0; }
virtual IDataStoreNode* OpenNode(const char* Name, int debug=0) const { return 0; }
Run Code Online (Sandbox Code Playgroud)

以下调用(例如,可能还有其他调用)将是模棱两可的:

unsigned int val = 0; //could be double, float
OpenNode("", val);
Run Code Online (Sandbox Code Playgroud)

由于 aunsigned int可以转换为boolint,因此存在歧义。解决它的最简单方法是将参数强制转换为首选重载中的参数类型:

OpenNode("", (bool)val);
Run Code Online (Sandbox Code Playgroud)

或者

OpenNode("", (int)val);
Run Code Online (Sandbox Code Playgroud)