Когда я пытался ответить на другой вопрос, я обнаружил, что следующее не компилируется
#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, я сомневаюсь, что в конце концов есть какие-то проблемы с шаблонами.