asit_dhal
asit_dhal

Reputation: 1269

ambiguous call in template error

Can anyone tell me the cause of error ?

Error is

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;
}

Upvotes: 3

Views: 7061

Answers (4)

insearchofcode
insearchofcode

Reputation: 448

This ambiguous errors occur due to using std functions as general functions. There are two ways to overcome this.

1) Instead of declaring using namespace std; use std::cout whenever you need to print any and std::endl for new line.

#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) You can also change the swap to Swap to not conflict with the inbuilt std::swap function.

#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;
}

Upvotes: 0

ks1322
ks1322

Reputation: 35708

Your swap conflicts with std::swap. Remove using namespace std; above and correct the rest code from std namespace.

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

Also it's worth reading Why is "using namespace std" considered bad practice?

Upvotes: 14

thb
thb

Reputation: 14434

Rename swap() as swap2() or the like. Or, better, never issue using namespace std;.

As written, your code introduces std::swap() through iostream, then dumps it atop your own swap() by using namespace.

Upvotes: 3

giorashc
giorashc

Reputation: 13713

There is already a swap function declared somewhere in your code. Change the function's name or remove the declaration of the other swap function.

Upvotes: 0

Related Questions