编译器错误C2448返回std流

时间:2011-07-28 21:36:27

标签: c++ stream compiler-errors

我有一个Visual Studio 2008 C ++程序,我有自己的流实现。像这样:

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的构造函数不是?

谢谢, PaulH

1 个答案:

答案 0 :(得分:2)

您的Foo类继承自不可复制的类,但您没有实现复制构造函数。当您按值传递Foo的实例时,您将遇到麻烦,就像在getter函数中一样。

GetFoo的工作原因可能是返回值优化正在忽略复制结构,但这并不意味着您可以这样做。