оператор << и ссылка std :: stringstream? - PullRequest
3 голосов
/ 09 мая 2011

У меня есть класс, который содержит ссылку на поток строк (используется как общий журнал приложения). Как добавить текст в указанный поток строк?

Пример (поскольку я не могу опубликовать фактический источник здесь ...)
Основной

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]'

Я знаю, что ошибка в том, что я использую ссылку и все еще пытаюсь сделать '<<', но как еще мне это сделать? <code>m_refLog-><< ???

Ответы [ 3 ]

7 голосов
/ 09 мая 2011

Сначала отмените ссылку на указатель

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

В конструкторе инициализируйте указатель на элемент stringstream с помощью NULL

RandomClass::RandomClass() : m_refLog(NULL) 
{
...
}
2 голосов
/ 09 мая 2011

У вас есть указатель, а не ссылка.Разыщите его, чтобы получить сам поток.

(напомним, что ptr->foo() эквивалентно (*ptr).foo().)

Я бы также рекомендовал, чтобы ваши функции принимали const std::string& вместо указателей наБуферы в стиле C char.

И .c_str() в вашем примере является избыточным.

void RandomClass::addText(const std::string& text) {
  (*m_refLog) << text;
}
2 голосов
/ 09 мая 2011

Похоже, что ваш m_refLog член StringStream * (то есть указатель на StringStream), а не StringStream (или StringStream &. Это источник ваших ошибок компиляции.

...