2017-11-24 1 views
0

私は何か非常に単純なものを見逃しているようです。以下は動作しません:スタンダードを返す方法::オプション<myclass>を関数からですか?

#include <optional> 

class Alpha { 
    Alpha() { } 
    Alpha(const Alpha& that) { } 
    Alpha(Alpha&& that) { } 
    ~Alpha() { } 

    static std::optional<Alpha> go() { 
     return Alpha(); 
    } 
}; 

を私が得るエラーは以下のとおりです。

no suitable user-defined conversion from "Alpha" to "std::optional<Alpha>" exists 
T in optional<T> must satisfy the requirements of Destructible 
'return': cannot convert from 'Alpha' to 'std::optional<Alpha>' 

は、私が何をしないのです、あなたは理由を説明してくださいできますか?

答えて

5

すべてのコンストラクタを非公開にしました。 std::optionalはクラスを移動またはコピーできません。これを修正するには、単にそれを行う:あなたはまた、デフォルトでは、パブリックメンバを持つクラスがあるstructを、使用することができます

class Alpha { 
public: // <--- there 
    Alpha() { } 
    Alpha(const Alpha& that) { } 
    Alpha(Alpha&& that) { } 
    ~Alpha() {} 

private: 
    static std::optional<Alpha> go() { 
     return Alpha(); 
    } 
}; 

また、既定のコンストラクタと代入演算子は、空のコンストラクタと代入演算子が空のコンストラクタや代入演算子を配置した場所では、通常より優れています。

+0

Argh!ちょうど私の心をスキップしました。ありがとう。 – Roxy

+0

@Roxy構造体を使用し続ける多くの理由の1つ) –

+0

@GuillaumeRacicot私が知る限り、 'struct'と' class'はデフォルトのアクセス修飾子を除いて同じです。私はあなたが 'struct'を好むべき他の理由が何か不思議です。 –

関連する問題