编译错误C2448返回标准流

compiler error C2448 returning a std stream

本文关键字:标准 返回 C2448 错误 编译      更新时间:2023-10-16

我有一个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

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

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