C++函数重载不明确

标签 c++ operator-overloading overloading lexical

在 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/

相关文章:

C++ `operator function_type()` 这样的事情可能吗?

C++ 函数重载类似的转换

c++ - 重载插入运算符 : no operator found which takes a right-hand operand of type 'unsigned int' (or there is no acceptable conversion)

c++ - 输出类似于 FORTRAN 的未格式化 C++

c++ - 模板显式实例化如何工作以及何时工作?

c++ - 安全地重载流操作符>>

c++ - 如何在 C++ 中创建一个将一个数组复制到另一个数组的运算符

java - Java 中的伪重载

c++ - 有两个线程的运行时间与一个线程的运行时间没有改善

c++ - 有没有办法让函数返回一个类型名?