Класс с 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, вы можете преодолеть это ограничение, сделав свой тип подвижным.