C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

Rust の trait で Option<Self> や Result<Self, E> を return する関数を定義しようとして [E0277] で怒られた時に思い出すメモ

問題

// ↓これは問題ありません
trait Trait { fn function() -> Self; }

// ↓これは E0277: the size for values of type `Self` cannot be known at compilation time
trait TraitOptional { fn function() -> Option<Self>; }

// -> Result<Self, E> とかする場合も同様です(省略)

回避方法

// Self の代わりにジェネリクスを噛ませて
trait TraitOptional<T> { fn function() -> Option<T>; }

struct Struct{}

// impl するときにジェネリクスの型引数に for と同じ型を渡す
impl TraitOptional<Struct> for Struct
{ 
 fn function() -> Option<Self>
 {
  Some( Self{} )
 }
}