0

当我编译这段代码时,我收到一条错误消息

重载的调用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;
}

为什么即使只有交换功能,交换功能也会重载?

4

2 回答 2

3

你应该使用

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

如果你想调用你定义的那个。由于std还定义了一个函数模板,如果你不使用swap,编译器会搜索。std namespace::

更具体地说,参数a和是 中定义b的类型,当编译器搜索 时,它会找到两个版本:一个在 中,另一个是您在 中定义。您需要告诉编译器它应该明确使用哪一个,否则会导致歧义。intstd namespaceswapstd namespaceglobal namespace

于 2013-04-20T02:32:06.980 回答
2

因为你有“使用命名空间 std;”,并且大概你正在包括“算法”,所以你可以看到 std::swap。这会给您带来编译器警告您的歧义。

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

于 2013-04-20T02:39:26.757 回答