运营商LT;<和std :: stringstream引用?

时间:2011-05-09 12:46:42

标签: c++ std stringstream

我有一个类,它包含对stringstream的引用(用作整个应用程序日志)。如何在引用的字符串流中添加文本?​​

一个例子(因为我不能在这里发布实际来源......)

stringstream appLog;
RandomClass myClass;
.....
myClass.storeLog(&applog);
myClass.addText("Hello World");
cout << appLog.str().c_str() << endl;

RandomClass cpp

void RandomClass::storeLog(stringstream *appLog)
{
  m_refLog = appLog;
}

void RandomClass::addText(const char text[])
{
  m_refLog << text;    //help here...?
}

我使用与上面非常相似的设置和方法结构在我的真实应用中收到以下错误。 error C2296: '<<' : illegal, left operand has type 'std::stringstream *'
error C2297: '<<' : illegal, right operand has type 'const char [11]'

我知道错误是因为我正在使用引用并且仍在尝试执行'&lt;&lt;',但我还能怎样做呢? m_refLog-><< ...

3 个答案:

答案 0 :(得分:7)

首先取消引用指针

void RandomClass::addText(const char text[])
{
    if ( m_refLog != NULL )
        (*m_refLog) << text;    
}

在构造函数中,使用NULL

初始化指向stringstream的成员指针
RandomClass::RandomClass() : m_refLog(NULL) 
{
...
}

答案 1 :(得分:2)

您的m_refLog成员看起来像StringStream *(即指针指向StringStream),而不是StringStream(或StringStream &。这是编译错误的来源。

答案 2 :(得分:2)

你有一个指针,而不是一个参考。取消引用它以获得流本身。

(回想一下,ptr->foo()相当于(*ptr).foo()。)

我还建议您的函数接受const std::string&而不是指向C风格char缓冲区的指针。

您示例中的.c_str()是多余的。

void RandomClass::addText(const std::string& text) {
  (*m_refLog) << text;
}