C++ 错误:调用重载‘;最大值(整数,整数)和#x2019;含糊不清 #包括 使用名称空间std; 样板 T最大值(T左侧,T右侧) { 返回lhs

C++ 错误:调用重载‘;最大值(整数,整数)和#x2019;含糊不清 #包括 使用名称空间std; 样板 T最大值(T左侧,T右侧) { 返回lhs,c++,stl,C++,Stl,这都是因为您使用了名称空间std;。请删除该行。 通过使用该指令,您将std::max(必须通过iostream以某种方式包含)带入全局范围。因此编译器不知道调用哪个max::max或std::max 我希望这个例子对于那些认为使用指令是免费的人来说是一个很好的例子。奇怪的错误是一个副作用。你正在与std::max()发生冲突。将它重命名为类似于mymax的其他名称,它就会工作。你有max和std::max。编译器不知道你要调用哪一个 您可以通过调用::max(4,5)或std::max(4,5

这都是因为您使用了
名称空间std;
。请删除该行。 通过使用该指令,您将
std::max
(必须通过iostream以某种方式包含)带入全局范围。因此编译器不知道调用哪个
max
::max或
std::max


我希望这个例子对于那些认为使用指令是免费的人来说是一个很好的例子。奇怪的错误是一个副作用。

你正在与
std::max()发生冲突
。将它重命名为类似于
mymax
的其他名称,它就会工作。

你有
max
std::max
。编译器不知道你要调用哪一个


您可以通过调用
::max(4,5)
std::max(4,5)
来判断,或者更好的方法是在文件中不使用
名称空间std

这是因为已经定义了std::max模板函数。
删除“using namespace std”并在需要时添加“std::”,或使用“::max”。

问题是已经有一个由std定义的名为“max”的函数。若要解决此问题,请将函数重命名为其他函数,如下所示:

#include <iostream>

using namespace std;

template<typename T>
T max(T lhs, T rhs)
{
  return lhs < rhs ? rhs : lhs;
}
template<>
int max<int>(int lhs, int rhs)
{
  return lhs < rhs ? rhs : lhs;
}

int main()
{
  cout << max<int>(4, 5) << endl;

}

~/Documents/C++/boost $ g++ -o testSTL testSTL.cpp -Wall
testSTL.cpp: In function ‘int main()’:
testSTL.cpp:18:24: error: call of overloaded ‘max(int, int)’ is ambiguous
testSTL.cpp:11:5: note: candidates are: T max(T, T) [with T = int]
/usr/include/c++/4.5/bits/stl_algobase.h:209:5: note:                 const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]
#包括
使用名称空间std;
样板
T mymax(T左、T右)
{
返回lhscout我猜编译器无法确定是使用std::max还是使用你的max,因为你有一个使用名称空间std;而且你的max和std::max都符合要求

删除
使用名称空间std;
@Richard:因为英语不是我们大多数人的第一语言。@VJovic:这不是借口。同时,英语的其他部分如果你学会了,问问题的正确方式可能是。我不明白任何人,不管是否以英语为母语,都会想到“如何纠正这个错误”是一个神奇的问题结构。@RichardJ.RossIII:这个网站上不是每个人都是以英语为母语的,而且很难理解一个表达的真正含义。至少达到了最终目标:你理解了他的问题。:)我猜英语不是他们的第一语言-我希望我在外语方面有那么好ge,所以我不能抱怨:pEven最好不要像Armen提到的那样在
std
名称空间中定义它。OP从未在
std
名称空间中定义过它。我建议不要将
std
名称空间的所有名称都放在全局范围内。将标准库放在std名称空间中的目的是为了让您可以定义自己的名称空间
max
函数在某些其他名称空间(或全局)中,或者一般来说,不必不断思考标准(或任何其他名称)中使用了哪些名称如果你不使用名称空间来解决命名冲突并继续使用前缀,那么名称空间的意义首先是什么?并且停止使用
名称空间std
但是值得注意的是,不使用名称空间会产生ADL副作用。:-D Ex:没有人编写std::cout。operator@stinky472:ADL是标准的。编译器不支持rting应该扔掉。@Study472:Sutter在很多书中都有很多关于为什么不这样做或那样做的章节,因为虽然它是标准的,但msvc不能正确地使用它。这都是由FUD驱动的,应该向编译器人员施加压力,让他们来修复自己的东西,而不是让程序员使用各种各样的解决方法。ADL在主要的开源编译器BTW.@ LeNNESSRACESEnEnr:当然不是。ADL主要是因为操作员的问题而发明的,所以依赖ADL是完全可以的。@ StutyY42: ADL规则在C++标准中是很好定义的,它们比规则、超负荷解析度或模板化点的规则要复杂得多。油墨不依靠ADL是一种不好的做法,而不是相反
#include <iostream>

using namespace std;

template<typename T>
T mymax(T lhs, T rhs)
{
    return lhs < rhs ? rhs : lhs;
}
template<>
int mymax<int>(int lhs, int rhs)
{
    return lhs < rhs ? rhs : lhs;
}

int main()
{
    cout << mymax<int>(4, 5) << endl;

    return 0;
}