(コンパイルエラー)代替案、または解決策はあるでしょうか。{}コンパイルエラーのメッセージは以下です。票6よくある問題ですね。これには2つ解決策があります。ジェネリクスとトレイトオブジェクトです。ジェネリクスStructに型引数を追加して、実装している型も受け取るスタイルです。parameterエラーを防ぐ必要があります。{}トレイトオブジェクトもう1つはトレイトオブジェクトで、雑に言うとBoxで包んであげれば解決できます。{}正確にいうと&や&mut、Rcなどでも大丈夫ですが、ポインタ型でトレイトを参照してあげることでサイズ不定のエラーを防ぐことができます。見た目の話ではジェネリクスの方が少し煩雑ですが、静的に解決されるので高速に動作します。トレイトオブジェクトはポインタを挟むので少し遅くなります(もう少しいうとvtableというのを使うので単なるポインタの参照より遅いです)速度以外の点でいうと、トレイトオブジェクトは複数種類の実装を交ぜることができます。s.a.push(Box::new(true));}私は多くの場合ジェネリクスを使いますが、ジェネリクスを使うと型が煩雑になりすぎる場合やこのように複数の実装を交ぜたいときにはトレイトオブジェクトを使います。この方が自然な感じがします。存在も知りませんでした。|3おっしゃる通り、Traitのサイズ(厳密には、Traitを実装したあらゆる具象型のサイズ)はコンパイル時に一意に定まりません。以下のコードはコンパイルエラーになります。`Trait<i32>`}一方で、Traitを指すポインタのサイズならコンパイル時に定まります。Boxという所有権を持つポインタがありますので、Traitをそれに入れます。これをボックス化と呼びます。16}この方法を使うと、質問の例は以下のようになります。ボックス化したトレイトを「トレイトオブジェクト」と呼びます。トレイトオブジェクトに対するメソッド呼び出しでは、動的ディスパッチという手法が取られるので、もう一つの手法である静的ディスパッチに対して性能面でやや不利になります。(ちなみに、RustとC++を除くほとんどのオブジェクト指向言語では、動的ディスパッチのみをサポートしています。最初からボックス化されています)トレイトオブジェクトに関して、詳しくはこちらを参照してください。2つのポインタしか含まないのでトレイトオブジェクト自体のサイズは静的に分かりますね。分かりやすい実例までありがとうございます。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。