ошибка компилятора C2448, возвращающая поток std - PullRequest
0 голосов
/ 29 июля 2011

У меня есть программа 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 Ответ

2 голосов
/ 29 июля 2011

Ваш класс Foo наследуется от не копируемого класса, но вы не реализуете конструктор копирования.Вы обязательно попадете в беду, когда будете передавать экземпляры Foo по значению, как это происходит в функциях получения.

Причина, по которой работает GetFoo, может заключаться в том, что оптимизация возвращаемого значения исключает копиюстроительство, но это не значит, что вам разрешено это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...