views:

175

answers:

4
void outputString(const string &ss) {
    cout << "outputString(const string& ) " + ss << endl;
}

void outputString(const string ss) {
    cout << "outputString(const string ) " + ss << endl;
}

int main(void) {
    //! outputString("ambigiousmethod"); 
    const string constStr = "ambigiousmethod2";
    //! outputString(constStr);
} ///:~

How to make distinct call?

EDIT: This piece of code could be compiled with g++ and MSVC.

thanks.

A: 

According to your code, u need only

void outputString(const string &ss).

Because both methods cannot change the argument to the caller (because it's const reference or by-value passing).

Why do you need those 2 methods?

Drakosha
+10  A: 

C++ does not allow you to overload functions where the only difference in the function signature is that one takes an object and another takes reference to an object. So something like:

void foo(int);

and

void foo(int&);

is not allowed.

You need to change the number and/or the type of the parameter.

In your case the function that accepts a reference, you can make it accept a pointer, if you want to allow the function to change its argument.

codaddict
+1  A: 

You could change the signature of one of the methods. It may not look pretty, however it is the simplest way.

So you could in principle have

void outputString(const string &ss, int notneeded) {
    cout << "outputString(const string& ) " + ss << endl;
}

void outputString(const string ss) {
    cout << "outputString(const string ) " + ss << endl;
}

and when you want to call the first function just call it with:

outputString("ambigiousmethod", 0);

which will result in a distinguishing call.

There is no other way (I'd love to be proven wrong on this one) since C++ does not allow overloading where passing (by value or by reference) is the only difference in signature.

Edit: as pointed out by bzabhi, you could also change the signature by changing the reference to a pointer. In the example you gave that would work, however you may have to change function code on some occasions.

Rekreativc
but the source code above could be compiled with g++ and msvc and make me feel c++ does provide a way to make distinct call.
Jichao
A: 

I recommend using the techinque of giving each and every function a unique name., i.e., do not use syntax overloading. I have been using it for years and I've only found advantages in it.

Daniel Daranas