2个重载具有类似的转换

时间:2010-09-16 01:36:00

标签: c++

与此类似的问题 C++ Function Overloading Similar Conversions 已被问及我理解问题的一般前提。寻找解决方案。

我有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; }

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

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

2 个答案:

答案 0 :(得分:11)

boolint 可以用于区分函数重载。正如人们所料,bool参数更倾向于bool重载和int参数 - int重载。

根据错误消息判断(我假设您的问题的标题是您收到的错误消息的一部分),您所处理的是您提供的参数既不是bool也不是{的情况{1}},但转化为intbool并且排名相同。

例如,请考虑这个

int

前两个调用将以预期方式成功解析。第三个调用将无法解决,因为参数类型实际上是void foo(bool); void foo(int); int main() { foo(0); // OK foo(false); // OK foo(0u); // ERROR: ambiguous } ,但它支持对unsigned intbool的隐式转换,从而使调用变得模糊。

你是如何称呼你的职能的?向我们展示你想要传递的论据。

答案 1 :(得分:3)

对于以下功能:

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; }

以下调用(例如,可能还有其他调用)将不明确:

unsigned int val = 0; //could be double, float
OpenNode("", val);

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

OpenNode("", (bool)val);

OR

OpenNode("", (int)val);