2017-03-17 10 views
-1

最近、私はC++をよく理解し始めています。異なる問題があり、そのほとんどがはっきりし始めています。私が理解していないことの1つは、ostreamまたはクラス宣言のすべてのストリームを宣言しようとするとコンパイラが見つけたエラーです。例えば、ostreamの下敷きとクラス定義の宣言方法

class Test{ 
    stringbuff buff; 
    ostream out (&buff) 

; }

コンパイラが返すこのエラーメッセージ:私がしようとすると、

expected identifier before ‘&’ token 

Oneotherは次のとおりです。

stringstream stream(std::in|std::out); 

コンパイラが、なぜできない問題がある

error: ‘std::ios<char, std::char_traits<char> >::in’ is not a type 
    stringstream out(ios::in|ios::out); 

を返します。私はクラス宣言でこれらの「関数」と呼んでいます。たとえば、ostream(メソッド)の同じ方法で同じメソードを宣言する方法をもっと明確にするには、次のようにします。

私の英語のおかげで申し訳ありません。

+0

'ostream out {&buff};'はあなたのエラーを修正します。私はあまりにも疲れている、うまくいけば誰かが理由と他の解決策を説明する答えを書くだろう。 – DeiDei

+0

問題の原因となる実際のコードをセミコロンで記入してください。 –

答えて

0

問題はその文ostream out (&buff) ;は、データメンバーではなく関数メンバーを宣言しようとするとコンパイラによって処理されます。それはMost vexing parseの一般化されたケースです。

「C++ 11で導入された新しい統一初期化構文を使用すると、この問題は解決されます」と、クラス内の初期化ではostream out{ &buff };となります。

++ 11℃、より具体的にはちょうどあなたが={}またはコピー初期直接初期化を使用することができ、およびないデータメンバのための「直接のinit」の用法のいずれかで()クラス内の初期化。

もう1つの方法は、コンストラクタのinitリスト内でデータメンバーを初期化することです。

class Test 
{ 
    std::stringbuf buff ; 
    std::ostream out ; 
    public : 
    Test() : out(& buff) { } 
} ; 
関連する問題