0

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

谁知道以更聪明的方式解决这个问题的诀窍或技巧?

4

3 回答 3

2

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

我的直接猜测是您正在测试的代码与您发布的代码并不完全相同。例如,如果您没有使用重载int,我预计会出现关于模棱两可重载的错误(因为如上所述,存在从0所有其他重载所采用的类型的隐式转换)。我已经确认 VC++ 2008 按原样接受代码(VC 2010 以及 VC11 和 g++ 4.7.0 的测试版也是如此)。

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

于 2012-05-06T17:37:53.223 回答
0

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

于 2014-03-25T05:37:28.247 回答
0

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

此外,如果您考虑一下,拥有f(int *)f(char *)调用f(NULL) 模棱两可的,所以无论如何您都需要演员!除非您告诉编译器,否则编译器不会神奇地知道您的意图。因此,如果某些东西本质上是模棱两可的,您只需通过强制转换使其明确。

于 2012-05-06T14:07:55.337 回答