【问题标题】:"Use of plus() is ambiguous" error“使用 plus() 不明确”错误
【发布时间】:2015-07-23 16:52:23
【问题描述】:

我正在尝试编写一个函数,它接受两个数字并打印出它们的总和。

#include <iostream>

using namespace std;

int plus(int, int);

int main () {
 int a, b, result;
 cout << "2 numbrs";
 cin>>a>>b;
 result = plus(a,b);
 cout << result;
 return 0;
}

int plus(int a,int b) {
 int sum;
 sum = a+b;
 return sum;
}

我得到的错误:

use of `plus' is ambiguous

这是我的第一个 C++ 程序,实际上我在发现错误时变得盲目。

【问题讨论】:

  • 我们需要向using namespace std;宣战。
  • @FredLarson 很好奇几乎所有介绍性编程书籍/教程如何使用 using namespace std;没有正确解释这意味着什么,以及何时应该实际使用它。 (大多数时候你不应该)
  • 事实上,我阅读了很好的解释,当使用 using namespace std 时发生了什么,但我没有意识到这会导致这个问题。
  • @Jac08H 嗯,这有点像我的观点......如果你读了一个“解释”并且它没有解释为什么它是一个问题,那么它真的不是一个“好的解释”。

标签: c++ function add


【解决方案1】:

随便

result = ::plus(a,b);

或者重命名函数。这是关于为什么 using namespace std 不被认为是好的做法的一个很好的教训。

【讨论】:

  • @Jac08H 无需将您的问题标记为已解决。你可以接受适当的答案。
  • using namespace std 仅在头文件中被认为是不好的做法,在实现文件中也可以。 (因为它不会渗入其他模块)using namespace std 在这里可以。这里真正的问题是plus 函数是在无用地重新发明功能,并且使用一个常用词来做到这一点,而这个词恰好已经被标准库加载了语义。我建议要么直接使用运算符+ 而不是定义函数,要么在项目的命名空间中定义函数。
【解决方案2】:

stdnamespace 中已经有一个函数对象,名为plus。因为using namespace std; 这个std::plus 被放在全局命名空间中,这也是你的plus() 被命名的地方。当您尝试调用 plus() 时,编译器无法判断您指的是 std::plus 还是 plus(),因为它们都在全局命名空间中。

您有以下选择:

  1. 删除 using namespace std;(然后您需要限定 std 命名空间中的其他函数——例如 std::cout)。
  2. 将您的plus() 放入其自己的命名空间(例如mine),并使用mine::plus(a, b) 调用它。
  3. Call your function with ::plus() as suggested(假设你没有把它放在自己的命名空间中)。
  4. 重命名函数,以免名称冲突。

【讨论】:

  • std::plus 不是函数,它是函数对象。如果你想调用它,你需要做std::plus()(a,b)std::plus{}(a,b)
  • @LaurentLARIZZA 已修复。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多