2011-07-28 3 views
0

自分でストリームを実装しているVisual Studio 2008 C++プログラムがあります。このような何か:コンパイルエラーC2448標準ストリームを返す

class Foo : public std::ostream 
{ 
public: 
    Foo(int a) : std::ostream(&buf_) { }; 
    Foo(boost::shared_ptr<int> a) : std::ostream(&buf_) { }; 
private: 
    std::filebuf buf_; 
}; 

class Bar 
{ 
public: 
    Foo GetFoo() { return Foo(1); }; 
    Foo GetFoo2() { return Foo(boost::shared_ptr<int>(new int(1))); }; 
}; 

使用目的は、このようなものです:

Bar b; 
Foo f = b.GetFoo(); // works fine 
Foo f2 = b.GetFoo2(); // compiler error 

残念ながら、これは私にbasic_iosに関するコンパイラエラーを与えるコンストラクタをコピーします。

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' 

なぜ最初Foo(int)コンストラクタは、コンパイラで大丈夫ですが、boost::shared_ptrを含む1ではないでしょうか?

おかげで、 PaulH

答えて

2

あなたFooクラスは、非コピー可能クラスから継承している、まだあなたはコピーコンストラクタを実装していません。 getter関数の場合のように、Fooのインスタンスを渡すときに問題になることがあります。

GetFooが動作する理由は、戻り値の最適化がコピー構築を抹消している可能性がありますが、これが許可されているわけではありません。

+0

私はデバッグモードでコンパイルしていますので、RVOがオンになっているのは驚きです。 コピーコンストラクタをプライベートにするクラスから派生する場合、コピーコンストラクタを実装できますか? – PaulH

+0

これはRVOとインライン展開の組み合わせかもしれません。本当にチェックしたいのであれば、 'get'関数を別のTUに入れることができます。 –

関連する問題