模板错误中的模糊调用

时间:2012-03-30 18:34:16

标签: c++

有人能告诉我错误的原因吗?

错误是

C:\web\template1.cpp||In function 'int main()':|
C:\web\template1.cpp|23|error: call of overloaded 'swap(int&, int&)' is ambiguous|
C:\web\template1.cpp|6|note: candidates are: void swap(X&, X&) [with X = int]|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\move.h|76|note:                 void std::swap(_Tp&, _Tp&) [with _Tp = int]|
C:\web\template1.cpp|24|error: call of overloaded 'swap(double&, double&)' is ambiguous|
C:\web\template1.cpp|6|note: candidates are: void swap(X&, X&) [with X = double]|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\move.h|76|note:                 void std::swap(_Tp&, _Tp&) [with _Tp = double]|
C:\web\template1.cpp|25|error: call of overloaded 'swap(char&, char&)' is ambiguous|
C:\web\template1.cpp|6|note: candidates are: void swap(X&, X&) [with X = char]|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\move.h|76|note:                 void std::swap(_Tp&, _Tp&) [with _Tp = char]|
||=== Build finished: 3 errors, 0 warnings ===|

#include <iostream>

using namespace std;

template <typename X>
void swap(X &a, X &b)
{
    X temp = a;
    a = b;
    b = temp;
}

int main()
{
    int i=10, j=20;
    double x=10.1, y=23.3;
    char a='x', b='z';

    cout<<"i="<<i<<"\tj="<<j<<endl;
    cout<<"x="<<x<<"\ty="<<y<<endl;
    cout<<"a="<<a<<"\tb="<<b<<endl;

    swap(i,j);
    swap(x,y);
    swap(a,b);

    cout<<"i="<<i<<"\tj="<<j<<endl;
    cout<<"x="<<x<<"\ty="<<y<<endl;
    cout<<"a="<<a<<"\tb="<<b<<endl;

    return 0;
}

4 个答案:

答案 0 :(得分:10)

您的swapstd::swap发生冲突。删除上面的using namespace std;并更正std命名空间中的其余代码。

std::cout<<"i="<<i<<"\tj="<<j<<std::endl;
std::cout<<"x="<<x<<"\ty="<<y<<std::endl;
std::cout<<"a="<<a<<"\tb="<<b<<std::endl;

还值得一读Why is "using namespace std" considered bad practice?

答案 1 :(得分:2)

swap()重命名为swap2()等。或者,更好的是,永远不要发出using namespace std;

正如所写,您的代码通过 iostream 引入std::swap(),然后通过swap()将其转储到您自己的using namespace上。

答案 2 :(得分:0)

在您的代码中已经声明了某个交换函数。更改函数的名称或删除其他交换函数的声明。

答案 3 :(得分:0)

由于将std函数用作常规函数,因此会出现此模棱两可的错误。 有两种方法可以解决这个问题。

1)使用using namespace std;而不是声明std::cout     每当您需要打印任何内容时,std::endl用于换行。

#include <iostream>

template <typename X>
void swap(X &a, X &b)
{
    X temp = a;
    a = b;
    b = temp;
}

int main()
{
    int i=10, j=20;
    double x=10.1, y=23.3;
    char a='x', b='z';

    std::cout<<"i="<<i<<"\tj="<<j<<std::endl;
    std::cout<<"x="<<x<<"\ty="<<y<<std::endl;
    std::cout<<"a="<<a<<"\tb="<<b<<std::endl;

    swap(i,j);
    swap(x,y);
    swap(a,b);

    std::cout<<"i="<<i<<"\tj="<<j<<std::endl;
    std::cout<<"x="<<x<<"\ty="<<y<<std::endl;
    std::cout<<"a="<<a<<"\tb="<<b<<std::endl;

    return 0;
}

2)您也可以将swap更改为Swap,以免与内置的std::swap功能冲突。

#include <iostream>

using namespace std;

template <typename X>
void Swap(X &a, X &b)
{
    X temp = a;
    a = b;
    b = temp;
}

int main()
{
    int i=10, j=20;
    double x=10.1, y=23.3;
    char a='x', b='z';

    cout<<"i="<<i<<"\tj="<<j<<endl;
    cout<<"x="<<x<<"\ty="<<y<<endl;
    cout<<"a="<<a<<"\tb="<<b<<endl;

    Swap(i,j);
    Swap(x,y);
    Swap(a,b);

    cout<<"i="<<i<<"\tj="<<j<<endl;
    cout<<"x="<<x<<"\ty="<<y<<endl;
    cout<<"a="<<a<<"\tb="<<b<<endl;

    return 0;
}