具有字符串流的类尝试按值传递

Class with stringstream trying to pass by value?

本文关键字:按值传递 字符串      更新时间:2023-10-16

我有一个带有字符串流的类:

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 FilesMicrosoft Visual Studio 9.0VCincludesstream 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:
...

流是不可复制的,因此它是您的NetMessageEncoder,因为它包含流作为成员。如果您使用的是 C++11,则可以通过使类型可移动来克服此限制。

您可以执行以下操作之一:

1)覆盖NetMessageEncoder的复制构造函数和赋值运算符并自己处理流复制(我想在您的情况下,使用新的流进行复制就足够了)

2) 避免使用 std::vector<TableS*> m_games; 而不是 std::vector<TableS> m_games; 复制流