函数重载不会';t在C+中使用模板+;? 我学习C++,我已经看过模板的用法。
因此,我尝试使用以下模板实现以下两个功能:函数重载不会';t在C+中使用模板+;? 我学习C++,我已经看过模板的用法。,c++,templates,overloading,C++,Templates,Overloading,因此,我尝试使用以下模板实现以下两个功能: template <typename T> T max(T a, T b){ return (a > b) ? a : b; } template <typename T> T max(T a, T b, T c){ return max( max(a, b), c); } 上面的代码编译时没有错误 有人能解释一下吗 我哪里做错了?有一个问题与你有冲突。您是否有使用命名空间std的或在代码中的某个地方使
template <typename T>
T max(T a, T b){
return (a > b) ? a : b;
}
template <typename T>
T max(T a, T b, T c){
return max( max(a, b), c);
}
上面的代码编译时没有错误
有人能解释一下吗
我哪里做错了?有一个问题与你有冲突。您是否有使用命名空间std的代码>或在代码中的某个地方使用std::max
使用不同数量的参数重载模板函数应该有效。存在一个与之冲突的问题。您是否有使用命名空间std的代码>或在代码中的某个地方使用std::max
用不同数量的参数重载模板函数应该有效。既然已经有了std::max
,为什么还要命名函数max
?这很可能是你麻烦的原因。我意识到了我的错误。知道了!非常感谢。案例2起作用的原因是,如果模板和普通函数都能很好地匹配所有参数,那么非模板函数将在重载解决方案中获胜。对于这一点,有一个特定的限制规则。既然已经有了一个std::max
,为什么还要命名函数max
?这很可能是你麻烦的原因。我意识到了我的错误。知道了!非常感谢。案例2起作用的原因是,如果模板和普通函数都能很好地匹配所有参数,那么非模板函数将在重载解决方案中获胜。这有一个特定的打破僵局的规则。@manjula你去吧,把它拿出来,看看会发生什么,试着用std::cout
、使用std::string
等缩小的替换它。在代码中保持这种全局性不是很好的做法。@manjula也看到我意识到了我的错误。知道了!非常感谢。在实际代码中使用名称空间std(与小示例测试用例相反)是一个非常糟糕的主意。这在许多地方都会导致类似的问题。它被认为是非常糟糕的形式。@manjula你去吧,把它拿出来,看看会发生什么,试着用std::cout
、使用std::string
等缩小的替换它。在代码中保持这种全局性不是很好的做法。@manjula也看到我意识到了我的错误。知道了!非常感谢。在实际代码中使用名称空间std(与小示例测试用例相反)是一个非常糟糕的主意。这在许多地方都会导致类似的问题。这被认为是非常糟糕的形式。
templateEx.cpp:13:14: error: call to 'max' is ambiguous
return max( max(a, b), c);
^~~
templateEx.cpp:17:22: note: in instantiation of function template specialization
'max<int>' requested here
cout<<"2, 3, 4 : "<<max(2,3,4);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2654:1: note:
candidate function [with _Tp = int]
max(const _Tp& __a, const _Tp& __b)
^
templateEx.cpp:7:3: note: candidate function [with T = int]
T max(T a, T b){
^
1 error generated.
int max(int a, int b){
return (a > b) ? a : b;
}
int max(int a, int b, int c){
return max( max(a, b), c);
}