开发者

How to make an ambiguous call distinct in C++?

void outputString(const string &ss) {
    cout << "outpu开发者_开发问答tString(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.


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.


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.


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?


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜