在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 :(得分:2)
现在看来,你的代码不应该导致错误 - 没有歧义。传递0
(int
)时,很明显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之外,它不可隐式转换或与整数类型相比。