我有一个带有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
我认为这可能是因为向量需要复制类我猜是否会导致stringstream按值复制?
stringstream确实是原因,如果删除则编译好。
有没有办法解决这个问题?
由于
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:
...
答案 0 :(得分:4)
Streams是不可复制的,因此它是您的NetMessageEncoder
,因为它包含流作为成员。如果您使用 C ++ 11 ,则可以通过使类型可移动来克服此限制。
答案 1 :(得分:1)
您可以执行以下操作之一:
1)覆盖NetMessageEncoder
的复制构造函数和赋值运算符并自行处理流复制(对于您的情况,使用新的流复制就足够了,我猜)
2)避免使用std::vector<TableS*> m_games;
而不是std::vector<TableS> m_games;