Построение istringstream со строкой временно - PullRequest
2 голосов
/ 08 марта 2012

Когда я пытался ответить на другой вопрос, я обнаружил, что следующее не компилируется

#include <iostream>
#include <cstring>
#include <sstream>
#include <string>

using namespace std;

// (main omitted)
const char * coin = "3D";
istringstream ss(string(s));
int i;
ss >> hex >> i;              <--- error here
cout << (char) i << endl;

Сбой из-за следующей ошибки:

test.cpp:15:11: error: invalid operands of types ‘std::istringstream(std::string) {aka std::basic_istringstream<char>(std::basic_string<char>)}’ and ‘std::ios_base&(std::ios_base&)’ to binary ‘operator>>’

Пока следующее скомпилировано и работает правильно:

const char* coin = "3D";
string s(coin);
istringstream ss(s); // or directly istringstream ss("3D")
int i;
ss >> hex >> i;              
cout << (char) i << endl;

Если я посмотрю на определение конструктора istringstream, он принимает const std::string& (фактически basic_string<char> эквивалент), и это компилируется. Поэтому я предполагаю, что вывод аргументов шаблона имеет поведение, которое я не понимаю, и создаю не очень соответствующий istringstream, но почему?

Я использую GCC 4.6.1 (аромат Ubuntu).

РЕДАКТИРОВАТЬ: поскольку istringstream является typedef, я сомневаюсь, что в конце концов есть какие-то проблемы с шаблонами.

1 Ответ

5 голосов
/ 08 марта 2012
istringstream ss(string(s));

Ваш компилятор считает, что это объявление функции, принимающей string (с именем s) и возвращающей istringstream.Обведите аргумент в скобках, чтобы устранить его.Кстати, что такое s?Вы имели в виду coin там?

istringstream ss( (string(coin)) );

Прочитайте это , если вы запутались.

В этом конкретном случае вы, конечно, могли бы просто сделать это

istringstream ss(coin);

Если ваш компилятор поддерживает его, вы также можете избежать MVP, используя унифицированный синтаксис инициализации:

istringstream ss{string{coin}};

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

...