繁体   English   中英

c ++函数超载含糊不清

[英]c++ function overload ambiguous

在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时。 我的项目是核心库,所以我无法指导每个终端客户程序员。

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

就目前而言,您的代码不应该导致错误 - 没有歧义。 当传递0 (一个int )时,很明显foo(int) (身份转换)比其他任何一个更好(即使0也可以隐式转换为所有其他重载的类型)。

我的直接猜测是,您测试的代码与您发布的代码不完全相同。 如果,例如,你没有过载回吐int ,我期望一个不明的重载(因为,正如上面提到的,还有来自隐式转换误差0到所有其他重载采取的类型)。 我已经确认VC ++ 2008按原样接受代码(VC 2010以及VC11和g ++ 4.7.0的beta版也是如此)。

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

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

另外,如果你考虑一下,拥有f(int *)f(char *)并调用f(NULL) 不明确的,所以你还需要一个强制转换! 除非你说出来,否则编译器不会神奇地知道你的意图。 因此,如果某些东西本质上含糊不清,那么你只需要通过施法来明确它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM