0

これがどのテーマに該当するかがわかったら、このスレッドのタイトルをより適切なものに喜んで変更します.

エラーの原因となったコンストラクターのパラメーターを変更すると、エラーは発生しません。

このエラーは、正確なコンストラクターを含めた場合にのみ発生します。

error: no matching function for call to 'Object::Object(Object)'
note: candidates are: Object::Object(Object&)
note:                 Object::Object()

コード:

#include <iostream>

using namespace std;

class Object {

  public:

    Object() {}     /* default constructor - no problems at all */

    Object( Object & toCopy ) {}  /* Cause of error, but no error when commented out */

    Object func() {  
      Object obj;
      return obj;
    }

};

int main() {

  Object o = o.func();  /* this is the line that the error is actually on */

  return 0;

}
4

4 に答える 4

6

異常でひどいコピー コンストラクター、つまり非定数参照によって引数を取るコンストラクターを宣言しました。これは可能であり、他のコピー コンストラクターが暗黙的に定義されないことを意味します。ただし、一時的な値は非定数参照にバインドされないため、一時的な値からコピーを作成できないことも意味します。

やっていることをする理由がない限り (おそらくauto_obj:-) を定義したいですか?)、通常のコピー コンストラクターを引数付きで宣言する必要がありますObject const &(ただし、正しく定義するようにしてください!)。暗黙的に生成されたバージョンに依存する (コード内で「行をコメントアウト」したときに起こる); または C++11 では、宣言することでコピー コンストラクターをデフォルトObject(Object const &) = default;にすることができます。

(一般的な 3 つのルールでは、自明ではない独自のコピー コンストラクターを定義してはならない、または定義する場合は、ユーザー定義のデストラクターと代入演算子も必要であると述べられていることに注意してください。コードが正常であることを確認してください。 )

于 2013-09-11T23:09:43.220 に答える
1

あなたが得たエラー

error: no matching function for call to 'Object::Object(Object)'
note: candidates are: Object::Object(Object&)
note:                 Object::Object()

は、コンパイラが class の適切なコピー コンストラクタを探していることを意味しObjectます。あなたのクラス定義にはそのような関数はありません: あなたのバージョンは一時的なバインドに使用できません (以下を参照)。正しいバージョンは、次のように自分で定義できます。

Object(const Object& orig) {
    // and initialize data here, and return 
}

または、そのような関数を宣言しないだけで、作業バージョンが自動的に生成されるため、エラーも発生しません。


注: を定義しようとしていますObject( Object & toCopy ) {}非 const 参照を一時的に取得すると、一時オブジェクトを非 const 参照に割り当てることができないため、この一時オブジェクトを使用してコンストラクターでコピーを作成できないため、これは正しくありません。

したがって、この異なる方法を表現するには:

-> コンパイラはコピー コンストラクタを検索しています

-> あなたのバージョンを見つけます

-> そして、このバージョンは言う: 私はそれをしません

ついに:

Object o = o.func();

これは良い考えではありません。構築されていないか、すでに破棄されているオブジェクトの非静的メンバーを参照することは、未定義の動作です。静的にするので、適切に構築されたオブジェクトfunc()のように使用したり、呼び出したりできます。Object::func()

于 2013-09-11T23:19:10.853 に答える
0

以前に多くの人がすでに指摘したように、問題は、参照を受け取るコピー コンストラクターのみを定義したことですが、の呼び出しの戻り値o.func();右辺値であり、通常の参照ではなく、右辺値参照またはconst 参照にのみバインドできます。

ただし、コードには別の問題があり、その時点でまだ初期化されていないオブジェクトであるfunc()onを呼び出すことは非常に悪い考えです。おそらく、工場のイディオムを実装するつもりでしたか? この場合、次のように static を宣言し、 のスコープから呼び出すことをお勧めします。oObject func();Object

Object o = Object::func();
于 2013-09-11T23:22:45.613 に答える
0

Try Object(const Object &toCopy) { }

于 2013-09-11T23:07:06.767 に答える