c ++函数超载含糊不清

时间:2012-05-06 13:59:30

标签: c++ operator-overloading overloading lexical

在c ++中

void foo(int i)
{ std::cout<<"int"<<std::endl; }

void foo(float i)
{ std::cout<<"float"<<std::endl; }

void foo(void *i)
{ std::cout<<"void *"<<std::endl; }

void foo(bool b)
{ std::cout<<"bool"<<std::endl; }

void main() { foo(0); }

编译时,会出错 在visual-studio 2008中,错误是 C2668:'function':对重载函数的模糊调用

我知道为什么会出现这个问题,我知道使用时间类型转换的解决方案。但我认为这不是一个好的解决方案,因为使用这种方式会破坏函数重载的词法。

在我的项目中,我创建了一个将自动类型更改为int,float,std :: basic_string和函数指针的词法对象。超载所有类型转换操作符和创建者。但是当我输入'NULL'时,会发生错误C2668。

事实上它几乎没有问题。唯一严重的问题是使用FALSE时。我的项目是核心库,所以我无法指导每个终端客户程序员。

谁知道解决这个问题的技巧或提示更聪明的方法?

3 个答案:

答案 0 :(得分:2)

现在看来,你的代码不应该导致错误 - 没有歧义。传递0int)时,很明显foo(int)(身份转换)比任何其他人更合适(即使0也可以隐式转换为所有其他重载)。

我的直接猜测是,您测试的代码与您发布的代码不完全相同。例如,如果 not 过载int,我会发现有关模糊重载的错误(因为,如上所述,{{1}有隐式转换}到所有其他重载所采用的类型)。我已经确认VC ++ 2008按原样接受代码(VC 2010以及VC11和g ++ 4.7.0的beta版也是如此)。

顺便说一句,我注意到0应该真正返回main(虽然它几乎肯定与手头的问题无关)。

答案 1 :(得分:0)

也许您可以将FALSE定义为((bool)0)而不是仅定义为0(为什么不使用false?)。

另外,如果您考虑一下,f(int *)f(char *)以及f(NULL) 的调用是不明确的,所以无论如何都需要投射!除非你说出来,否则编译器不会神奇地知道你的意图。因此,如果某些事情本质上含糊不清,那么你只需要通过强制转换来明确它。

答案 2 :(得分:0)

C ++ 11通过引入一个new关键字作为一个区分空指针常量来解决这个问题:nullptr。它的类型为nullptr_t,它是可隐式转换的,可与任何指针类型或指向成员类型的类型相媲美。除了bool之外,它不可隐式转换或与整数类型相比。