1

我刚刚开始使用 c++ 中的函数模板。我正在使用这些教程。我正在尝试实现一个类似这样的基本代码。

#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)

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

4

3 回答 3

4

您需要删除:

using namespace std;

你正在与std::max. 这是原因之一Why “using namespace std;” is considered bad practice,这就是C++ FAQs take on it. 打字std::cout真的没那么糟糕,你会很快习惯添加std::,从长远来看它只会为你省去麻烦。

于 2013-08-13T18:21:58.217 回答
2

这里的问题是您定义的“max”模板函数与作为 STL 一部分的 max 函数冲突。您和 STL 的签名相同,并且都是模板函数。STL 的最大值在命名空间“std”内。但是由于您在代码中指定了“使用命名空间 std”,因此 STL 的最大值变得可见。我可以想到 3 种方法来避免这种情况

1)将您的最大值重命名为 max1 或其他名称

2)注释“使用命名空间std”并将cout替换为std::cout

3)替换以下

c=max<int>(a,b);

c=::max<int>(a,b);

在函数调用前添加 :: 告诉编译器从全局命名空间中选择函数。您的函数在全局命名空间中定义。

于 2013-08-13T18:31:01.703 回答
1

另一种方法是::在调用max函数模板时添加:

 c=::max<int>(a,b);

这将告诉编译器max在全局命名空间中查找函数模板。在这种情况下,max将使用您的版本。您可以在这里找到现场演示:演示

于 2013-08-13T18:32:25.900 回答