струнный вопрос - PullRequest
       2

струнный вопрос

0 голосов
/ 24 июня 2010

Я не могу получить следующий stringstreamm для компиляции

stringstream qss;

qss.operator <<  "some text " ::stringstream.operator << DDateTime::date2Oracle(dFrom) ::stringstream.operator <<  " more text " ::stringstream.operator <<  DDateTime::date2Oracle(dUntil);

Если я просто использую оператор << без ::stringstream.operator, он жалуется на неоднозначность оператора, теперь он жалуется на неправильный синтаксис ...

error C2143: syntax error : missing ';' before 'std::stringstream'

EDIT:

ошибка C2593: «оператор <<» неоднозначен c: \ Program Files \ Microsoft Visual Studio .NET 2003 \ Vc7 \ include \ ostream (434): может быть 'std :: basic_ostream <_Elem, _Traits> :: _ Myt & std :: basic_ostream <_Elem, _Traits> :: operator < <(std :: basic_ostream <_Elem, _Traits> :: _ Mysb *) ' с [ _Elem = символ, _Traits = станд :: char_traits ]

Ответы [ 7 ]

3 голосов
/ 24 июня 2010

Ключевым словам operator здесь не место, оставьте их:

qss << "some text" << DDateTime::date2Oracle(dFrom) << " more text " <<  DDateTime::date2Oracle(dUntil);

Это должно быть совершенно правильно и однозначно, если только функция date2Oracle не перегружена.

Правильный шаблон для реализации operator<< для типа T:

template<typename Char, typename Traits>
std::basic_ostream<Char, Traits>
operator<<(std::basic_ostream<Char, Traits>& stream, const T& object) {
  // now put something into the stream
  return stream;   // return stream << xyz ... is also possible
}
2 голосов
/ 24 июня 2010

Ну, очевидно, что любой тип DDateTime::date2Oracle(dFrom) не реализует оператор <<. Так что вам придется написать один самостоятельно.

Что касается синтаксиса, в первую очередь вы должны вызывать его так же, как функцию, которой он на самом деле является:

stringstream qss;
operator<<(
     (operator<<(qss <<  "some text ", 
                 DDateTime::date2Oracle(dFrom)) << " more text "),
      DDateTime::date2Oracle(dUntil));

И, во-вторых, stringstream определено в std пространстве имен, поэтому вы должны написать его как std::stringstream или ::std::stringstream. ::stringstream будет искать его в глобальном пространстве имен, и такой класс там не определен.

Кстати, operator<< обычно реализуется как свободная функция, поэтому qss.operator<< не будет работать.

2 голосов
/ 24 июня 2010

Иди действительно фанк:

qss.operator <<("some text ");
qss.operator <<(DDateTime::date2Oracle(dFrom));
qss.operator <<(" more text "); 
qss.operator <<(DDateTime::date2Oracle(dUntil));

И вы, вероятно, получите лучшее представление о том, в чем заключается двусмысленность.

2 голосов
/ 24 июня 2010

Вы должны вызывать оператора как функцию.

std::stringstream s;

operator<<(s, "Your string")
1 голос
/ 24 июня 2010

Не должно быть достаточно с qss << "some text " << DDateTime...?

1 голос
/ 24 июня 2010

Приведение к / строит строку явно:

qss << "some text " << string(DDateTime::date2Oracle(dFrom)) 
    <<  " more text " <<  string(DDateTime::date2Oracle(dUntil));
0 голосов
/ 24 июня 2010

Что вам мешает делать:

stringstream s;
s << "some text" << (DDateTime::date2Oracle(dFrom)) << "more text" << (DDateTime::date2Oracle(dUntil)) ;
...