使用带有void函数的模板

时间:2016-02-27 12:31:49

标签: c++ templates

我正在尝试使用带有void函数的c ++模板泛型

代码:

#include <iostream>

using namespace std;

template <typename T>
inline void swap(T& x, T& y)
{
    T temp = x;
    x = y;
    y = temp;
}

int main() 
{
    cout << "Swapper!" << endl;
    int x, y;
    cin >> x >> y;
    swap(x, y);
    cout << x << y;
    cin.get();
    return 0;
}

但是它给出了一个错误:

调用重载的swap()是不明确的

如何删除此错误?

2 个答案:

答案 0 :(得分:3)

问题是using namespace std;。您几乎不应该在代码中的任何地方使用 行。一个好方法是改为质量所有std名称,即写std::cout << "Swapper!" << std::endl;而不是cout << "Swapper!" << endl;

在这种特殊情况下,您自己的swap功能与您通过std::swap间接获得的<iostream>冲突。虽然std::swap <algorithm><utility>中仅存在using namespace std; 保证,但允许所有C ++标准标头引入任何其他C ++标准标头。

因此,一旦您包含任何标准标头,std就会在[[year, month, day], ...]中与所有名称产生潜在冲突。

答案 1 :(得分:2)

您应该删除using namespace std;,因为此命名空间已包含名为swap 的函数,并且编译器不知道选择哪个。说实话,你自己并不需要自己编写这样的功能,它已经为你完成了。

另一种方法是将您的函数重命名为swap以外的其他内容。