0

以下のようにコンストラクターをオーバーロードできないことはわかっています (唯一の違いは初期化リストです)。

myClass(const INT& oInt,const STRING& oStr):I(oInt),STR(oStr){

        cout << "my Class Object Created with I : " << I << " STR : " << STR << endl;
}

myClass(const INT& oInt,const STRING& oStr){
        I=oInt;
        STR=oStr;
        cout << "my Class Object Created with I : " << I << " STR : " << STR << endl;
}

しかし、コンストラクターを次のようにオーバーロードしたいとします。

myClass(const INT& oInt,const STRING& oStr):I(oInt),STR(oStr);
myClass(const INT oInt,const STRING oStr);

つまり、別のパラメータ タイプに基づいてone as reference typeas normal type

私は私の古い質問を参照しています: クラスメンバー関数のオーバーロード

それは達成できますか?

私のコードは次のとおりです。

#include <iostream>
#include <string>

using namespace std;

class INT{
int i;
    public:

INT(int i=0):i(i){
        cout << "INT Class Object Created with i : " << i << endl;
}

~INT()
{
    cout << "INT Class Object Destructed with i :" << i << endl;
}

INT(const INT& I){
    i=I.i;
        cout << "INT Class Copy Constructor called for i : "<< i << endl;
}

INT& operator= (const INT& I){

    i=I.i;
        cout << "INT Assignment operator called for i : "<< i << endl;
    return *this;
}

friend ostream& operator << (ostream& os,const INT& I){
        os << I.i ;
    return os;
}

};



class STRING{

    string str;

    public:
STRING(string str=""):str(str){

    cout << "STRING Class Object Created with str : " << str << endl;
}
~STRING()
{
    cout << "STRING Class Object Destructed with str :" << str << endl;
}


STRING(const STRING& S){
    str=S.str;
        cout << "STRING Class Copy Constructor called for str : "<< str << endl;
}

STRING& operator= (const STRING& S){

    str=S.str;
        cout << "STRING Assignment operator called for str : "<< str << endl;
    return *this;
}

friend ostream& operator << (ostream& os,const STRING& S){
        os << S.str ;
    return os;
}

};


class myClass{

    INT I;
        STRING STR;
    public:

myClass(const INT& oInt,const STRING& oStr):I(oInt),STR(oStr){

    cout << "my Class Object Created with I : " << I << " STR : " << STR << endl;
}

myClass(const INT oInt,const STRING oStr){
        I=oInt;
    STR=oStr;
    cout << "my Class Object Created with I : " << I << " STR : " << STR << endl;
}



~myClass()
{

    cout << "my Class Object Destructed with I : " << I << " STR : " << STR << endl;

}

};





int main()
{

       INT iObj(5);
       STRING strObj("Alina Peterson");


      cout << "\n\n======================================================\n\n" << endl;

      myClass myObj(iObj,strObj);

      cout << "\n\n======================================================\n\n" << endl;

    return 0;
}

私が得ているエラーは次のとおりです。

$ g++ -g -Wall CPP.cpp -o CPP
CPP.cpp: In function ‘int main()’:
CPP.cpp:116:32: error: call of overloaded ‘myClass(INT&, STRING&)’ is ambiguous
       myClass myObj(iObj,strObj);
                                ^
CPP.cpp:116:32: note: candidates are:
CPP.cpp:86:1: note: myClass::myClass(INT, STRING)
 myClass(const INT oInt,const STRING oStr){
 ^
CPP.cpp:81:1: note: myClass::myClass(const INT&, const STRING&)
 myClass(const INT& oInt,const STRING& oStr):I(oInt),STR(oStr){
 ^

オーバーロードされたコンストラクターの 2 つのバージョンを区別できるように、コンストラクターをキャストするにはどうすればよいですか?

4

4 に答える 4

2

T const&コンストラクターをオーバーロードできTますが、コンパイラーはコンストラクターを選択できず、呼び出し不可能なコンストラクターのペアになります。さらに、コンストラクターを明示的に選択することはできません。コンストラクターは通常の関数ではないため、キャストできません。したがって、T const&andでコンストラクターをオーバーロードすることTはまったく役に立ちません。ただし、右辺値に基づいてオーバーロードできT const&ます。1 つのコンストラクターが を受け取り、もう1 つのコンストラクターが を受け取りT&&ます。

どうやって達成しようとするかではなく、を達成したいかを尋ねた方がいいかもしれません...

于 2014-05-05T16:24:36.723 に答える
1

次の 2 つの関数があるとします。

void foo(int const x) {}
void foo(int const& x) {}

電話すると

foo(10);

コンパイラは、オーバーロードされた 2 つの関数を区別できません。

あなたが持っているとき:

void foo(int& x) {}
void foo(int const& x) {}

と同じ呼び出しを行うとfoo(10);、コンパイラは 2 番目の呼び出しを正しく選択します。

あなたが持っているもの

myClass(const INT& oInt,const STRING& oStr);

myClass(const INT oInt,const STRING oStr);

関数の最初のペアに類似しています。

自問すべき質問は、そのようなオーバーロードを作成するように導く要件は何かということです。それらは本当の要件ですか?特別な要件でない限り、そのうちの 1 つだけで対応できるはずです。

于 2014-05-05T16:19:18.257 に答える