我刚开始在c ++中使用函数模板。我正在使用these教程。我正在尝试实现类似这样的基本代码。
#include<iostream>
using namespace std;
template<class t>
t max(t a,t b){
t max_value;
max_value = (a>b)?a:b;
return max_value;
}
int main(){
int a=9,b=8,c;
c=max<int>(a,b);
cout<<c;
return 0;
}
但是我收到以下错误。
/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
gmake[1]: Entering directory `/home/gursheel/NetBeansProjects/project_q7'
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/project_q7
gmake[2]: Entering directory `/home/gursheel/NetBeansProjects/project_q7'
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
g++ -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:16:19: error: call of overloaded ‘max(int&, int&)’ is ambiguous
main.cpp:16:19: note: candidates are:
main.cpp:4:3: note: t max(t, t) [with t = int]
In file included from /usr/include/c++/4.7/bits/char_traits.h:41:0,
from /usr/include/c++/4.7/ios:41,
from /usr/include/c++/4.7/ostream:40,
from /usr/include/c++/4.7/iostream:40,
from main.cpp:1:
/usr/include/c++/4.7/bits/stl_algobase.h:210:5: note: const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]
gmake[2]: *** [build/Debug/GNU-Linux-x86/main.o] Error 1
gmake[2]: Leaving directory `/home/gursheel/NetBeansProjects/project_q7'
gmake[1]: *** [.build-conf] Error 2
gmake[1]: Leaving directory `/home/gursheel/NetBeansProjects/project_q7'
gmake: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 318ms)
我无法理解错误究竟是什么。任何帮助将不胜感激。
答案 0 :(得分:4)
您需要删除:
using namespace std;
你正在与std::max
发生冲突。这是Why “using namespace std;” is considered bad practice
的原因之一,这是C++ FAQs take on it
。打字std::cout
真的不是那么糟糕,你会习惯很快地添加std::
,从长远来看它只会给你带来麻烦。
答案 1 :(得分:2)
这里的问题是您定义的“max”模板函数与作为STL一部分的max函数冲突。你和STL都有相同的签名,都是模板功能。 STL的最大值在命名空间“std”内。但是,由于您在代码中指定了“using namespace std”,因此STL的max已经可见。我可以通过3种方式来避免这种情况
1)将您的max重命名为max1或其他名称
2)注释“using namespace std”并将cout替换为std :: cout
3)替换以下
c=max<int>(a,b);
与
c=::max<int>(a,b);
在函数调用中预先设置::告诉编译器从全局命名空间中选择函数。您的函数在全局命名空间中定义。
答案 2 :(得分:1)
另一种方法是在调用::
功能模板时添加max
:
c=::max<int>(a,b);
这将告诉编译器在全局命名空间中找到max
函数模板。在这种情况下,将使用您的max
版本。您可以在此处找到现场演示:Demo