3
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);
} ///:~

明確な電話をかける方法は?

編集:このコードはg++とMSVCでコンパイルできます。

ありがとう。

4

4 に答える 4

10

C ++では、関数をオーバーロードすることはできません。関数シグネチャの唯一の違いは、1つがオブジェクトを取得し、もう1つがオブジェクトへの参照を取得することです。だから次のようなもの:

void foo(int);

void foo(int&);

許可されていません。

パラメータの数やタイプを変更する必要があります。

あなたの場合、関数が引数を変更できるようにしたい場合はreference、を受け入れる関数を受け入れるようにすることができます。pointer

于 2009-12-24T09:49:43.343 に答える
1

いずれかのメソッドのシグネチャを変更できます。見た目はきれいではないかもしれませんが、最も簡単な方法です。

だからあなたは原則として持つことができます

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

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

最初の関数を呼び出したいときは、次のように呼び出します。

outputString("ambigiousmethod", 0);

これにより、識別可能な呼び出しが発生します。

C ++は、(値または参照による)受け渡しが署名の唯一の違いである場合、オーバーロードを許可しないため、他の方法はありません(これについて間違っていることが証明されることを望んでいます)。

編集:bzabhiが指摘しているように、ポインターへの参照を変更することで署名を変更することもできます。あなたが与えた例ではそれはうまくいくでしょう、しかしあなたは時々関数コードを変更しなければならないかもしれません。

于 2009-12-24T09:53:01.970 に答える
0

あなたのコードによると、あなたは必要なだけです

void outputString(const string &ss).

どちらのメソッドも呼び出し元への引数を変更できないため(const参照または値による受け渡しであるため)。

なぜこれらの2つの方法が必要なのですか?

于 2009-12-24T09:47:17.897 に答える
0

すべての関数に一意の名前を付ける手法を使用することをお勧めします。つまり、構文のオーバーロードを使用しないでください。私はそれを何年も使用してきました、そして私はそれに利点を見つけただけです。

于 2010-04-09T09:50:04.730 に答える