在 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' : ambiguous call to overloaded 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 的测试版也是如此)。
顺便说一句,我会注意到 main
应该真正返回一个 int
(尽管它几乎肯定与手头的问题无关)。
关于C++函数重载不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471085/