我正在尝试制作struct,其中成员之一是std::stringstream类型。我正在使用C++ 11,根据http://www.cplusplus.com/reference/sstream/stringstream/operator=/可以做到。

这是我的代码:

struct logline_t
    {
        stringstream logString; /*!< String line to be saved to a file (and printed to cout). */
        ElogLevel logLevel; /*!< The \ref ElogLevel of this line. */
        timeval currentTime; /*!< time stamp of current log line */

        logline_t& operator =(const logline_t& a)
        {
            logString = a.logString;
            logLevel = a.logLevel;
            currentTime = a.currentTime;

            return *this;
        }
    };

它没有编译,因为我收到此错误:
error: use of deleted function ‘std::basic_stringstream<char>& std::basic_stringstream<char>::operator=(const std::basic_stringstream<char>&)’

我不明白为什么它不起作用。我也尝试过logString = move(a.logString);。结果相同。我将不胜感激。

编辑:这是我的代码,我已经应用了大多数用户建议的更改,并且在我的代码中他们没有编译。我仍然在struct的开头出现错误。

CLogger.h

第40行:../src/CLogger.h:40:9: error: use of deleted function ‘std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)’
CLogger.cpp

第86行:../src/CLogger.cpp:86:41: error: use of deleted function ‘CLogger::logline_t::logline_t(const CLogger::logline_t&)’
第91行:../src/CLogger.cpp:91:9: error: use of deleted function ‘CLogger::logline_t::logline_t(const CLogger::logline_t&)’
如果需要任何其他信息,我会提供。

最佳答案

std::stringstream是不可复制的。要复制内容,您只需将一个流的内容写入另一流:

logString << a.logString.str();

更新:
另外,如果您没有遵循好的建议以使用复制构造函数使用 copy-and-swap 习惯来实现operator=,则必须首先清除流:
logString.str({});
logString << a.logString.str();

要不就
logString.str(a.logString.str());

另外,您可能会想使用rdbuf()代替:
logString << a.logString.rdbuf();

但这是不正确的,因为它会更改a.logString的状态(尽管a.logStringconsta.logString.rdbuf()是指向非const对象的指针)。以下代码演示了这一点:
logline_t l1;
l1.logString << "hello";
logline_t l2, l3;
l2 = l1;
l1.logString << "world";
l3 = l1;
// incorrectly outputs: l2: hello, l3: world
// correct output is: l2: hello, l3: helloworld
std::cout << "l2: " << l2.logString.str() << ", l3: " << l3.logString.str() << std::endl;

10-01 09:04