私はC ++の知識に照らして説明できない問題を思いつきました。
タイプXの構造体への定数参照をとるクラスがありますが、タイプX(以前に初期化したもの)の引数を渡すと、コンパイラーから、メンバーの最初のメンバーに変換できないというエラーが表示されます。 Xの。これは私には意味がありません。
エラーはclangとg ++で似ているため、ひどいものが欠けていると思います。
error: no viable conversion from 'const Foo::X' to 'Foo::FooTypes'
XからZの最初のメンバーであるFooTypesに変換しようとしているのはなぜですか?
class Foo {
public:
enum FooTypes {
JPEG
};
struct Z {
FooTypes type;
int a;
};
struct X {
Z caps;
double host_address;
};
Foo(const X& x);
private:
const X x;
};
Foo::Foo(const Foo::X& x) :
x{x} {
}
int main() {
Foo::X new_x = {
{Foo::JPEG, 1}, 1.58 };
Foo *s = new Foo(new_x);
delete s;
return 0;
}
中括弧の代わりに丸括弧を使用する必要があります。
...
const X m_x;
};
Foo::Foo(const Foo::X& x) :
m_x(x) {
}
...
リストの初期化は次のとおりです。
...
m_x{x.caps, x.host_address}
...
@PauloNevesを編集します。BjarneStroustrupのドキュメントhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdfを見つけました。これには、次の定義が含まれています。
「初期化子リスト」の一般的な考え方(EWGで長年議論されているように)は、初期化子を許可するすべてのコンテキストで、中括弧で囲まれた式のリストを使用できるようにすることです。次のリストはN2532から削除されました。
- 変数の初期化; 例:X x {v};
- 一時的なものの初期化; 例:X {v}
- 明示的な型変換; 例:x X {v};
- 無料の店舗割り当て。例:p new X {v}
- 戻り値; 例:X f(){/ * ... * / return {v}; }
- 引数の受け渡し; 例:void f(X); /* ... */ F V});
- ベースの初期化; 例:Y :: Y(v):X {v} {/ * ... * /};
- メンバーの初期化; 例:Y :: Y(v):mx {v} {X mx; / * ... * /};
説明されているメンバーの初期化はあなたのケースだと思います。だから私にとってはg ++ 4.9の欠陥のように見えます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加