Ошибка no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'std::vector<int>') 34 | cin >> v; Что не так?

Рейтинг: 0Ответов: 1Опубликовано: 22.06.2023

Я делаю задание 14 главы 19 из книги "Принципы и практика использования C++" Бьерн Страуструп. Я добавил перегрузку операторов >> и << для вектора типа T. Но что-то происходит не так и у меня не работает код. Помогите пожалуйста! Вот код:

#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::ostream;
using std::istream;
void keep_window_open () {char ch; cin >> ch;}

template<typename T> class S 
{
        T val;
    public:
        S(T value): val{value} {}
        T& get();
        T get() const {return val;}
        T& operator=(const T& value);

};

template<typename T> T& S<T>::get() {return val;}

template<typename T> T& S<T>::operator=(const T& value) 
{
    val = value;
    return val;
}

template<typename T> T& read_val(T& v) 
{
    cin >> v;
    return v;
}

template<typename T> ostream& operator<<(ostream& os, vector<T> vec) 
{
    os << "{";
    for (int i = 0; i < vec.size(); ++i) {
        os << " " << vec[i];
        if (i != vec.size() - 1) os << ",";
    }
    os << "}";
    return os;
}

template<typename T> istream& operator>>(istream& is, vector<T> vec) 
{
    for (int i = 0; i < vec.size(); ++i) {
        is >> vec[i];
        cout << endl;
    }
    return is;
}

int main() 
{
    S<int> number {read_val(number.get())};
    S<double> dou {read_val(dou.get())};
    S<char> ch {read_val(ch.get())};
    S<string> str {read_val(str.get())};
    vector<int> vec (3);
    S<vector<int>> vs {read_val(vs.get())};
    cout << number.get() << " " << dou.get() << " " << ch.get() << " " << str.get() << " " <<   vs.get() << endl;
    keep_window_open();
    return 0;
}

Перегрузка для вектора типа T нужна, чтобы использовать на векторе функцию read_val. Нужно было. чтобы с помощью функции read_val написать значение val для объекта vs. Но что-то пошло не так.

Ответы

▲ 0

Ну собственно как написал maestro - в функции main вы пытаетесь использовать объекты number, dou, ch, str, vs до их инициализации.
Правильнее будет писать так

S<int> number {0};
read_val(number.get());

S<string> str {""};
read_val(str.get());

vector<int> vec{ 1, 2, 3};
S<vector<int>> vs {vec};
read_val(vs.get());

А ещё проще сделать в классе S конструктор по-умолчанию и перегрузить operator>>. И тогда вводить значения вот так:

S<string> str;
cin >> str;