[英]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.