0

自分のクラス「myClass」のインスタンスを宣言しようとしたときに問題が発生しました。たとえばmyClass class()、コンパイル エラーが発生しました。

私は本質的に、引数を取らず、タイプ「myClass」を返す関数「クラス」を宣言しているため、いくつかの読み取りを行い、その理由がわかりました。私は今これを見ます。しかし、私が理解していないのは、オーバーロードされたコンストラクターがある場合、なぜコンパイラーはこれを考えないのmyClass class(argument)ですか?型「myClass」を返す1つの引数で関数「クラス」を宣言しようとしていますか?

引数の型がなく、オーバーロードされたコンストラクターであることを知っているためですか?

4

3 に答える 3

1

が変数の名前、またはtypeargumentとして解釈できない式である場合、コンパイラがこれを関数宣言として解釈する方法はありません。関数宣言では、パラメーターを省略してそのパラメーターのみを指定できるためです。タイプしますが、その逆はありません。

ただし、次のようなものがある場合:

myClass object(myOtherClass());

objectこれは、デフォルトで構築された type のテンポラリから呼び出されたオブジェクトをコピー構築しようとする試みと考えることができますが、myOtherClassいわゆるMost Vexing Parseに遭遇することになります: 実際、コンパイラは上記を の宣言として解釈します。objecttype のオブジェクトを返し、myClassその唯一の引数として引数を取らず、 type の値を返す関数を受け入れる関数myOtherClass

于 2013-03-25T00:02:15.310 に答える
1
myClass myclass()

name myclass、戻り値の型myClass、パラメーターなしの関数を宣言します。これはhttp://en.wikipedia.org/wiki/Most_vexing_parseとして知られています

既定のコンストラクターを呼び出すクラス オブジェクトを宣言するときは、次のことを行います。

myClass obj;

関数の引数は何らかの型でなければなりません。

myClass myclass(argument)

myClassは、オブジェクト名でクラスのオブジェクトを作成することを意味しますmyclass

myClass myclass(typename 引数)

関数を宣言し、コンストラクターを呼び出していません。typename必須ですがargument、関数プロトタイプではオプションです。

于 2013-03-25T00:03:57.883 に答える
1

それは正しい。関数宣言への引数は型である必要があるため、型でない場合、コンパイラはそれが関数宣言ではないことを認識し、代わりにインスタンスを構築して引数をパラメーターとして渡すと想定します。このロジックは、コンストラクターが引数を持たない特殊なケースを除いて、非常にうまく機能します。この場合、あいまいです。C++ は、可能であればステートメントを宣言として扱うことを優先することで、このあいまいさを解決します。そのため、パラメーターを持たないインスタンスを作成するには、パラメーター リストから除外します。

于 2013-03-24T23:59:21.263 に答える