为什么模板功能不明确?

时间:2013-04-20 02:29:43

标签: c++ templates

编译此代码时,出现错误

  

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

但我这里只写了一个交换函数。

你能告诉我为什么函数含糊不清以及我需要做些什么改变来正确运行程序?

using namespace std;

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

int main()
{
    int a, b;

    cout << "Enter two elements: ";

    cin >> a;
    cin >> b;

    swap(a, b);
    cout << "a is "<<a << '\t'<<"b is " << b << std::endl;

    return 0;
}

为什么交换函数重载,即使它只有交换函数?

2 个答案:

答案 0 :(得分:3)

你应该使用

 ::swap(a,b); //use one in global namespace, which is the one you defined

如果您想拨打您定义的那个。由于std还定义了swap函数模板,因此如果您不使用std namespace,编译器将搜索::

更具体地说,参数ab属于int类型,在std namespace中定义,当编译器搜索swap时,它将找到两个版本:std namespace中的版本和global namespace中定义的版本。你需要告诉编译器应该明确使用哪一个,否则会导致歧义。

答案 1 :(得分:2)

因为您有“using namespace std;”,并且可能包含“algorithm”,所以您可以看到std :: swap。这为您提供了编译器警告您的模糊性。

解决方案是要么不添加“using namespace std;”,要么显式地在未命名的命名空间中调用自己的函数,方法是将其称为“:: swap(a,b)”