我创建了一个模板,但收到了错误。
模板和main(这个代码在一个cpp文件中):
#include <iostream>
using namespace std;
template<class T>
void swap(T& x, T& y);
template<class T>
void swap(T& x, T& y){
T temp = x;
x = y;
y = temp;
}
int main(){
int n1 = 10, n2 = 5;
cout << "number before swap: num1= " << n1 << " num2= " << n2 << endl;
swap(n1, n2);//compilation error
cout << "number after swap: num1= " << n1 << " num2= " << n2 << endl;
system("pause");
return 0;
}
错误:
Error 1 error C2668: 'std::swap' : ambiguous call to overloaded function
c:\projects\template\main.cpp 42 1 Template
2 IntelliSense: more than one instance of overloaded function "swap"
matches the argument list:
function template "void swap(T &x, T &y)"
function template "void std::swap(_Ty &, _Ty &)"
argument types are: (int, int) c:\Projects\Template\main.cpp 43
2 Template
为什么我会收到错误我不明白,因为一切都很好。 谢谢你的帮助。
感谢&#39;第
答案 0 :(得分:5)
您正在使用using namespace std;
。因此,编译器无法知道行swap(n1, n2);
是否意味着使用std::swap
或您的自定义swap
。您可以通过显式指定要使用的命名空间来解决歧义。您可以使用::
指定全局命名空间,这是您定义swap
函数的位置。尝试:
int main()
{
int n1 = 10, n2 = 5;
cout << "number before swap: num1= " << n1 << " num2= " << n2 << endl;
::swap(n1, n2);
cout << "number after swap: num1= " << n1 << " num2= " << n2 << endl;
return 0;
}
但是,这里的真正解决方案是删除using namespace std;
。请参阅here,了解为何这是一种不良做法。
答案 1 :(得分:0)
如果您必须拥有using namespace std
声明并实现自己的交换功能,则可以将函数名称更改为以大写字母Swap()
开头。由于C ++区分大小写,因此可以避免冲突,从而避免模糊。但是,使用标准库版本是一种更好的做法。