2013-08-13 6 views
7

たとえば、私はどのタイプになるのかわからないので、タイプautoの変数を持っていました。"auto"メンバー変数を使用することはできますか?

私はそれが私にこのエラーを与えているクラス/構造体宣言で宣言しよう:

Cannot deduce auto type. Initializer required

は、それを回避する方法はありますか?

struct Timer { 

    auto start; 

}; 
+1

フィギュアうち、その種類 –

+4

は、そのテンプレートがのためにあるものではないですか? – user1520427

+0

どのようなタイプになりますか?コンパイル時間または実行時間?あなたは私たちにいくつかの文脈を与えることができますあなたは何をしようとしているのですか? – Homer6

答えて

20

次のことができますが、あなたはそれをstaticconstを宣言する必要があります。

struct Timer { 
    static const auto start = 0; 
}; 

A working example in Coliru

この制限により、非スタティックメンバーとしてstartを持つことはできません。異なるオブジェクトに異なる値を設定することはできません。

あなたが別のオブジェクトに対してstartの異なる種類をしたい場合は、より良いあなたがTの種類を推定したい場合は、あなたが行う工場出荷時のような関数を作ることができ

template<typename T> 
struct Timer { 
    T start; 
}; 

テンプレートとしてあなたのクラスを持っていますタイプ控除。

template<typename T> 
Timer<typename std::decay<T>::type> MakeTimer(T&& startVal) { // Forwards the parameter 
    return Timer<typename std::decay<T>::type>{std::forward<T>(startVal)}; 
} 

Live example

3

これはC++ draft standardセクションでは、メンバ変数のためautoを使用することについて7.1.6.4 auto specifier段落4言いたいことです:それは、これを初期化する必要がありますので

The auto type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears within the member-specification of a class definition (9.4.2).

も、それはconstでなければならないことを意味しています。だから、次のようなものは動作します:

struct Timer 
{ 
    const static int start = 1; 
}; 

を私はマークが示唆するように、テンプレートを使用して、しかしそれはあなたがあまりにも多くなるとは思わないか、今、私はそれについていくつかのより多くを考えることを多分あなたはちょうどその場合のVariant Typeを必要としますBoost.VariantまたはBoost.Anyをチェックしてください。

1

いいえ。それぞれのコンストラクタにstartの独自の初期化子を付けることができるため、一貫した型を使用することはできません。

あなたがを行う場合は、あなたがそれを使用することができ、使用可能な発現を有する:

struct Timer { 

    Foo getAFoo(); 

    delctype(Timer().getAFoo().Bar()) start; 

    Timer() : start(getAFoo().Bar()) { /***/ } 
}; 
関連する問題