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
私はデバッグモードでコンパイルしていますので、RVOがオンになっているのは驚きです。 コピーコンストラクタをプライベートにするクラスから派生する場合、コピーコンストラクタを実装できますか? – PaulH
これはRVOとインライン展開の組み合わせかもしれません。本当にチェックしたいのであれば、 'get'関数を別のTUに入れることができます。 –