我有一个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
答案 0 :(得分:2)
您的Foo
类继承自不可复制的类,但您没有实现复制构造函数。当您按值传递Foo
的实例时,您将遇到麻烦,就像在getter函数中一样。
GetFoo
的工作原因可能是返回值优化正在忽略复制结构,但这并不意味着您可以这样做。