問題タブ [most-vexing-parse]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - の左側に期待される構造。または .* しかし、それは構造体です
でコンパイル エラーが発生structure required on left side of . or .*
しますが、次の構造です。chest.contents[0]
chest
c++ - C++ で使用できるメンバーはありません
クラスがあります
そしてmain.cppには次のものがあります:
これはメソッドを宣言する正しい方法ですか、それとも間違っていますか? VS2010 はこのメソッドをまったく認識しません。それは次のように述べています
式にはクラス型が必要です
c++ - 最も厄介な解析とポインターの間接参照/逆参照
最小限のコード:
少なくともA((*p))
が呼び出されることを期待していましたA::A(int=0)
。複数の中括弧を入れても*p
、ステートメントを として扱いA *p;
ます。コンストラクターが呼び出されない関連ステートメントにも
同じことが当てはまります。ここにデモがあります。foo
A::A(int=0)
質問:
- (2) と (4) も宣言として扱われるのはなぜですか?
foo
ステートメント (3) および (4)の記述は何ですか?
c++ - このステートメントがコンストラクターを呼び出さない理由 - C++
テンプレート クラスと通常のクラス:
Holder<Animal>
次に、このステートメントでインスタンスを作成したいのですがHolder<Animal> a(Animal());
、失敗します。つまりAnimal()
、一時オブジェクトとして扱われません。Holder
そして、このステートメントはのコンストラクターを呼び出しません。
誰かが説明できたら?よくわかりません。a
ここでタイプになると思います。それから、私はそれを使用しますHolder<Animal> a = Holder<Animal>(Animal());
、それはうまくいきます。したがって、ここにはいくつかのケースがあります:
Holder<Animal> a(Animal()); a.Ref().Print(); // error
Holder<Animal> a = Holder<Animal>(Animal()); a.Ref().Print(); // ok
Holder<int> b(4); b.Ref() = 10; cout << b.Ref() << endl; //ok
説明できますか?私は最初の声明と少し混乱しています。そして、このステートメントが引き起こすエラー情報:
GCC4.7.2
:error: request for member 'Ref' in 'a', which is of non-class type 'Holder<Animal>(Animal (*)())'
VS10
: error C2228: left of '.Ref' must have class/struct/union
,error C2228: left of '.Print' must have class/struct/union
c++ - フレンド クラスからプライベート メンバーとパブリック メンバーにアクセスできません
PointTwoD というフレンド クラスを持つ locationdata というクラスがあります。
クラスを含むと思われる PointTwoD という別のクラスがあります: locationdata as a private member 。
};
main() で PointTwoD オブジェクトをインスタンス化しようとして、関数 fromn locationdata を使用すると、エラーが発生します: 非クラス型 PointTwoD()() の「テスト」でメンバー「ロケーション」を要求します。
私の質問は
1) フレンド クラスが機能しないのはなぜですか。一度宣言すると、フレンドからすべての関数を使用してすべてのプロパティにアクセスできるはずだと思いました
2) クラス PointTwoD からクラス locationdata のすべてのメソッドとプロパティにアクセスするには、フレンド クラスの代わりに継承を使用する必要がありますか??
最初の更新: 宣言を PointTwoD test() から PointTwoD test に変更した後、次のエラーが発生します。
c++ - 最も厄介な解析: なぜ `g( ( f() ) );` は `f` のデフォルト コンストラクターを呼び出して、`f` を取る `g` の ctor に結果を渡さないのですか?
これはMost bexing parse: why doesn't A a(());の複製ではありません。仕事?の形式の解析に基づいており、その OPは、余分な括弧のセットを使用してオブジェクトをA a(());
デフォルトで構築できると考えていました。A
f
対照的に、私の質問は 2 つのクラスg
についてf
です。統一された初期化構文を使用せずに、一時的な引数を指定して の ctorを呼び出したい。のctor にステートメントがあるため、出力がないことは、オブジェクトのインスタンス化ではなく、関数宣言を意味します。コメントでサンプルコードに 3 つの数字で注釈を付けました。#1 と #2 は #3 をコメントアウトしてコンパイルされ、その逆も同様です。g
f
g
f
std::cout
g
g
#1: #1g
は、 a を返し、0 引数を取り、 an を返す関数へのポインターを受け取る無名関数を宣言していると思いましたf
。私が間違っている?
#2: #2の余分な括弧のセットにより、囲まれた内容が関数呼び出し、つまりf
のデフォルト ctor への呼び出しとして評価されるようになると思いました。しかし、それはまだ関数宣言です。なんで?
#3: #2 の変形で、違いは #3 の追加されたインスタンス名myG
です。#1 と #2 がコメントアウトされている場合、#3 はオブジェクトをインスタンス化します。そうしないと、VC12 で次のエラーが発生します。
error LNK2019: unresolved external symbol "struct g __cdecl f(void)" (?f@@YA?AUg@@XZ) referenced in function _main
と
fatal error LNK1120: 1 unresolved externals
.
g ++ 4.8でのこのエラー:undefined reference to 'f()'
それらは何を意味し、なぜ私はそれらを得るのですか?
インスタンスに名前が付けられている場合にのみ #3 がオブジェクトのインスタンス化になるのはなぜですか?
インスタンスに名前を付けたり、均一な初期化を使用したりせずに、目的のインスタンス化効果を得るにはどうすればよいですか?