Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用重载‘;max(char&;,char&;)&x2019;含糊不清_C++_Templates_Overloading - Fatal编程技术网

C++ 调用重载‘;max(char&;,char&;)&x2019;含糊不清

C++ 调用重载‘;max(char&;,char&;)&x2019;含糊不清,c++,templates,overloading,C++,Templates,Overloading,这个max('c','b','a')不应该调用带有三个参数的重载函数吗?问题是,在std中已经有一个max,并且您所说的使用名称空间std: error: call of overloaded ‘max(char&, char&)’ is ambiguous 我不知道为什么max是可用的,因为您没有包括算法,但显然它是可用的 编辑 如果要使用顶部的保持该: template <typename T> T max (T a, T b, T c) { retu

这个
max('c','b','a')
不应该调用带有三个参数的重载函数吗?

问题是,在
std
中已经有一个
max
,并且您所说的
使用名称空间std

error: call of overloaded ‘max(char&, char&)’ is ambiguous
我不知道为什么
max
是可用的,因为您没有包括
算法,但显然它是可用的

编辑 如果要使用顶部的
保持该

template <typename T> T max (T a, T b, T c) 
{ 
   return max (max(a,b), c); /* Doesn't know which max to pick. */
}
模板最大温度(温度a、温度b、温度c)
{ 
返回::max(::max(a,b,c);
} 

没有不明确的呼叫。(请注意,第二行已注释)

问题是:
使用命名空间std

它会导致问题,因为它会将所有符号带入当前名称空间,而且它似乎直接或间接地包含定义
std::max
的头。因此,当您在代码中编写
::max
时,编译器将无法决定选择哪个
max
:您编写的还是标准库定义的


使用命名空间std删除
来自您的代码。

如果没有不明确的呼叫,我怀疑OP会提出这个问题。他们的编译器似乎肯定认为有。因为您没有使用
名称空间std
:-)谢谢纳瓦兹,但为什么它要使用“max('c','b')”?@Anisha:您还没有编写
max('c','b')
。您已经编写了
::max('c','b')
。两者之间有区别。第二个是一个限定名称,它说:选择在全局名称空间中定义的名称。哦,是的,我现在知道了。实际上,
::max('c','b')
不仅仅是调用三个参数的函数,而是调用带有两个参数的函数。:)OP定义了多个max函数。为此,他不需要包含算法头。@David和cnicutar:你说:
/*不知道选择哪个max*/
但是它不能选择带有两个参数的模板
max
?毕竟,当用'max('c','b')调用时,它是在挑选<代码>::max('c','b')
。@Anisha Kaul因为
::
指定了“我想使用我的
max
”。@cnicutar有点挑剔:Using::没有说使用我的,而是使用顶级命名空间中定义的名称空间。很可能是在某些头文件或其他文件中,有人在顶级名称空间中定义了max函数。这不应该发生在编写和封装良好的代码中,但您永远不知道。您是否将编写自己的
max
函数作为学习练习?为什么不直接使用编译器提供的std::max?@Victor这只是为了玩弄模板。这说明了为什么读取整个错误消息很重要。我相信它会继续列出候选项,在其中看到std::max应该已经解决了您的问题。请:尽量避免
使用名称空间
声明,并且确保在重用标准库中的名称时!
template <class T> const T& max ( const T& a, const T& b );
template <typename T> T max (T a, T b, T c) 
{ 
   return max (max(a,b), c); /* Doesn't know which max to pick. */
}
template <typename T> T max (T a, T b, T c) 
{ 
   return ::max(::max(a, b), c);
}