C ++函数模板错误

时间:2013-08-13 18:19:51

标签: c++ templates

我刚开始在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)

我无法理解错误究竟是什么。任何帮助将不胜感激。

3 个答案:

答案 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