Класс с stringstream пытается передать по значению?

У меня есть класс с потоком строк:

class NetMessageEncoder
{
    std::stringstream m_ss;
    std::stringstream m_numSS;
public:
    NetMessageEncoder();
    void beginMessage();

...

Затем у меня есть другой класс с экземпляром этого класса, который я пытаюсь сделать вектором:

m_games.resize(100);

Эта линия производит:

Error   1   error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'    c:\Program Files\Microsoft Visual Studio 9.0\VC\include\sstream 516

Я понимаю, что это может быть потому, что вектор должен копировать класс с помощью, я думаю, вызывает поток строк для копирования по значению или что-то?

Строковый поток действительно является причиной, компилируется нормально, если удалить.

Есть ли способ это исправить?

Спасибо

    struct TableS
    {
        ServerPlayer* m_players[4];
        SpadesGameInfo m_info;
        NetSpadesGame m_game;
        bool readyToPlay() const
        {
            int count = 0;
            for(int i = 0; i < 4; ++i)
            {
                if(m_players[i])
                {
                    count++;
                }
            }

            return count >= m_info.getNumPlayers();
        }
        TableS()
        {
            for(int i = 0; i < 4; ++i)
            {
                m_players[i] = NULL;
            }
        }
    };
    class ServerCore : public ServerHost, public NetEventListener
    {
        NetEventDecoder m_dec;
        NetEventEncoder m_enc;
        std::vector<ServerPlayer*> m_players;
        int m_totalPlayers;
        std::vector<TableS> m_games;
    public:
...

2 ответа

Решение

Вы можете сделать одно из следующих действий:

1) Переопределить конструктор копирования и оператор присваивания NetMessageEncoder и разберитесь с потоковым копированием самостоятельно (я полагаю, вам может понадобиться использовать новый поток для копирования)

2) Избегайте копирования потоков с помощью std::vector<TableS*> m_games; вместо std::vector<TableS> m_games;

Потоки не подлежат копированию, и поэтому ваш NetMessageEncoder так как он содержит потоки в качестве членов. Если вы используете C++11, вы можете преодолеть это ограничение, сделав свой тип подвижным.

Другие вопросы по тегам