c ++ - 当我创建模板时,我尝试使用它但得到错误(C2668)和IntelliSense错误

时间:2017-05-05 17:45:45

标签: c++ templates

我创建了一个模板,但收到了错误。

模板和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;第

2 个答案:

答案 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 ++区分大小写,因此可以避免冲突,从而避免模糊。但是,使用标准库版本是一种更好的做法。