левый операнд имеет тип 'std :: stringstream (__cdecl *) (std :: string)'

0

какая разница в двух кодах:

char buf[2048];
stringstream in(string(buf));
int tmpInt;

while ((in >> tmpInt)) { // wrong, error C2296: '>>' : illegal, left operand has type 'std::stringstream (__cdecl *)(std::string)'

}

а также

char buf[2048];
string tmpStr(buf);
stringstream in(tmpStr); 

while ((in >> tmpInt)) { // right

}

Я думаю, что они делают то же самое: оба используют строку для построения объекта stringstream. Независимо от временного объекта или реального объекта, мы будем называть конструктор строковых копий в stringstream (просто скопируйте содержимое buf)

IDE: vs2010

Итак, какая разница между этими двумя способами? или строковые методы реализации.

Благодарю.

  • 0
    Это самый неприятный анализ.
Теги:
stringstream

1 ответ

0
Лучший ответ

Крис дал ответ. Код эквивалентен следующему:

stringstream in(string buf);

В C++ люди называют это самым неприятным анализом.

Компилятор видит это как объявление функции. in - это функция, которая возвращает stringstream и принимает string в качестве аргумента. Обратите внимание, что ваш компилятор сообщает об этом в сообщении об ошибке std::stringstream (__cdecl *)(std::string).

Вам понадобится дополнительный набор круглых скобок или синтаксис синтаксиса C++ 11, чтобы сообщить компилятору, что это не функция, которую вы объявляете:

stringstream in((string(buf)));

stringstream in{string(buf)};
  • 0
    О, я понял. Скомпилируй, думай, что это функция forward forward. спасибо Джесси.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню