Я бы хотел иметь operator>>()
перегрузки для любого типа «base» и для любого типа контейнера. Это то, что я до сих пор:Как заставить оператора >> (C <T>) перегрузка для соответствия контейнеру?
typedef uintmax_t my_t;
template <typename T>
std::istringstream &operator>>(std::istringstream &iss, T &v)
{
static my_t um = 6009;
v = um++;
return iss;
}
template <template <class> class C, typename T>
std::istringstream &operator>>(std::istringstream &iss, C<T> &c)
{
for (typename C<T>::iterator it = c.begin(); it != c.end(); ++it)
iss >> *it;
return iss;
}
int main()
{
std::vector<uint32_t> vi(3);
std::istringstream iss;
iss >> vi;
for (std::vector<uint32_t>::iterator it = vi.begin(); it != vi.end(); ++it)
std::cout << *it << std::endl;
}
компилируется и работает, как ожидалось с GCC, но даже не компилируется на VS2015. Последний соответствует оператору >>
в операторе iss >> vi;
с первой перегрузкой базового типа, которая запускает другие ошибки компиляции. Как написать шаблон operator>>()
для неконтейнерных типов и шаблон для типов контейнеров (без необходимости специализации для каждого типа контейнера), который компилируется с GCC и VS2015?
Это не должно компилироваться нигде. Какую версию GCC вы используете? –
Интересно .. Я не могу это сделать для компиляции на g ++ 5.1.0 - как вы его смогли скомпилировать на своей версии gcc? – Alejandro
Здесь он находится на [codepad.org] (http://codepad.org/juUAvEP6). Говорят, что это [g ++ 4.1.2] (http://codepad.org/about). – plong