Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 08.08.2021
Сообщений: 14

Компилятор не видит поток вывода

11.08.2021, 12:38. Показов 2081. Ответов 11
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Учу c++, столкнулся с такой проблемой, написал как выводить, но компилятор не замечает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
template<typename Container, typename Element>
ostream& operator<<(ostream& out, const Container& container) {
    for (const Element& element : container) {
        out << element << " "s;
    }
    return out;
 
}
int main() {
    const vector<int> ages = {10, 5, 2, 12};
    cout << ages << endl;
}
Вот такую ошибку получаю, мол не выводится так

Code
1
2
3
4
5
6
7
8
9
Ошибка компиляции:
/tmp/tmppf6ks3ax/submission.cpp: In function ‘int main_5417218()’:
/tmp/tmppf6ks3ax/submission.cpp:17:10: error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const std::vector<int>’)
   17 |     cout << ages << endl;
      |     ~~~~ ^~ ~~~~
      |     |       |
      |     |       const std::vector<int>
      |     std::ostream {aka std::basic_ostream<char>}
compilation terminated due to -Wfatal-errors.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2021, 12:38
Ответы с готовыми решениями:

иерархия типов, конструкторы копирования, виртуальные деструкторы, перегруженные функции вывода в поток и вывода из потока...
Ребята помогите!!! Срочна на завтра нужно... ппц))) Создать иерархию типов, описывающая - студента, отца студента, студента-отца...

Компилятор не дорабатывает созданный поток
Тестил функцию с параметрами при многопоточном программировании: #include&lt;iostream&gt; #include&lt;thread&gt; ...

Поток вывода
Правильно ли я понимаю, что: ? Хотелось бы разобраться - не понимаю в этой теме.

11
Заблокирован
11.08.2021, 12:45
Цитата Сообщение от PavBan Посмотреть сообщение
out << element << " "s;
???
0
0 / 0 / 0
Регистрация: 08.08.2021
Сообщений: 14
11.08.2021, 12:48  [ТС]
<<" "s это пробел между элементами выводимого контейнера
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.08.2021, 12:59
Цитата Сообщение от PavBan Посмотреть сообщение
C++
1
2
template<typename Container, typename Element>
ostream& operator<<(ostream& out, const Container& container) {
У вас тут Element невыводим при подстановке. Соответственно этот шаблон отбрасывается.
Если вы сделаете так:
C++
1
2
template<typename Container>
ostream& operator<<(ostream& out, const Container& container)
то столкнетесь с другой проблемой. Ваша перегрузка слишком общая и начнет подходить почти всегда.
1
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
11.08.2021, 13:02
Лучший ответ Сообщение было отмечено PavBan как решение

Решение

Цитата Сообщение от PavBan Посмотреть сообщение
Учу c++, столкнулся с такой проблемой,
я поправил ваш код согласно тем ругательствам, которые вещал компилятор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
struct A
{   const char* s = " ";
};
 
ostream& operator<<(ostream& out, const A a)
{   out << a.s;
    return out;
}
 
template<typename Container>
ostream& operator<<(ostream& out, const Container& container)
{   for (const auto& element : container)
    {   out << element << A();
    }
    return out;
}
 
int main()
{   const vector<int> ages = {10, 5, 2, 12};
    cout << ages << endl;
}
1
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
11.08.2021, 13:03
но:
Цитата Сообщение от DrOffset Посмотреть сообщение
вы столкнетесь с другой проблемой
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.08.2021, 13:35
не ахти какое решение, но хоть для всех векторов перегрузил )) а что б для всех контейнеров надо мудрить, метапрограммирование ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <string>
using namespace std;
template<typename T>
ostream& operator<<(ostream& out, const vector<T>& container) {
    for (const auto& element : container) {
        out << element << " "s;
    }
    return out;
 
}
int main()
{
    const vector<int> ages = {10, 5, 2, 12};
    std::cout << ages << std::endl;
}
Добавлено через 2 минуты
хотя все равно фигня это, вложенный вектор дать, и распечатает все в ряд ))
не советую
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.08.2021, 13:46
PavBan,
C++
1
2
3
4
5
6
7
template<typename Container>
ostream& operator<<(ostream& out, const Container& container)
{   for (const auto& element : container)
    {   out << element << A();
    }
    return out;
}
тут лучше сделать так:
C++
1
2
3
4
5
6
7
8
9
10
template <typename Container>
std::ostream& operator<<(std::ostream& out, const Container& container)
{
    using std::operator<<; // !!!
   
    for (const auto& element : container) {
        out << element << " ";
    }
    return out;
}
Потому что код выше сломается, если, например, элементами вектора будет std::string.

Это, однако, не избавит от упомянутой в #4 проблемы.
Нужно накладывать более строгие ограничения на Container, чтобы от нее избавиться.
1
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
11.08.2021, 13:56
Цитата Сообщение от DrOffset Посмотреть сообщение
Это, однако, не избавит от упомянутой в #4 проблемы.
но, однако, ваша идея работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
#include <string>
 
namespace my
{
    template <typename Container>
    std::ostream& operator<<(std::ostream& out, const Container& container)
    {   using std::operator<<; // !!!
        for (const auto& element : container)
        {   out << element << " ";
        }
        return out;
    }
};
 
int main()
{
    const std::vector<int> ages = {10, 5, 2, 12};
    {
        using my::operator<<;
        std::cout << ages;
    }
 
    std::cout << "\n===========\n";
 
    {
        using my::operator<<;
        std::cout << ages;
    }
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.08.2021, 14:08
Цитата Сообщение от XLAT Посмотреть сообщение
но, однако, ваша идея работает:
Ну так да, будет работать. Но я имел в виду, что "не избавит" в смысле отсутствия каких-либо дополнительных телодвижений со стороны пользователя этого оператора. А так придется постоянно этот using указывать.

Добавлено через 4 минуты
XLAT, да, и речь шла вот о таком коде:
C++
1
2
3
4
5
6
7
8
9
10
 
int main()
{
    const std::vector<int> ages = {10, 5, 2, 12};
 
    {
        using my::operator<<;
        std::cout << ages << " "; // не поможет using 
    }
}
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
11.08.2021, 14:21
Цитата Сообщение от DrOffset Посмотреть сообщение
речь шла вот о таком коде:
тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <string>
 
struct A
{
    template <typename Container>
    A& operator<<(const Container& container)
    {   for (const auto& element : container)
        {   std::cout << element << " ";
        }
        return *this;
    }
}Cout;
 
int main()
{
    const std::vector<int> ages = {10, 5, 2, 12};
    Cout << ages << " !!!";
 
    std::cout << "\n===========\n";
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.08.2021, 14:40
Цитата Сообщение от DrOffset Посмотреть сообщение
Нужно накладывать более строгие ограничения на Container
Можно это сделать, например, так (С++20)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <vector>
#include <string>
#include <type_traits>
 
template<typename T, typename = void>
struct is_container 
    : std::false_type 
{};
 
template<typename C, typename T, typename A>
struct is_container<std::basic_string<C, T, A>>
    : std::false_type 
{};
 
template<typename T>
struct is_container<
        T,
        std::void_t<
            typename T::value_type,
            typename T::size_type,
            typename T::allocator_type,
            typename T::iterator,
            typename T::const_iterator,
            decltype(std::declval<T>().size()),
            decltype(std::declval<T>().begin()),
            decltype(std::declval<T>().end())
        >
     > 
    : std::true_type 
{};
 
template <typename Container>
    requires (is_container<Container>::value)
std::ostream& operator<<(std::ostream& out, const Container& container) 
{
    for (const auto& element : container)
    {   out << element << " ";
    }
    return out;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2021, 14:40
Помогаю со студенческими работами здесь

Компилятор не видит библиотеку
Добрый день. Появилась такая проблема: при подключении библиотеки visual studio ругается, что не видит ее. В visual studio переменную...

Компилятор не видит TGAIO::
вот код для загрузки текстуры GLint width, height; GLubyte * data = TGAIO::read(&quot;brick1.tga&quot;, width, height); // Copy file to...

Компилятор не видит JavaFX
Прочитал тучу гайдов как установить этот JavaFX, ничего не получается, не понимаю, как это должно работать Почему Main не наследует...

Компилятор не видит циклы!
Конечно, я понимаю что процессор ошибиться не может, и дело только в моем коде, но я считаю что я правильно использую команды break и...

Компилятор не видит vector
#include &lt;vector&gt; using std::vector; vector&lt;double&gt; v; выбивает ошибку вектор не стд, вектор не определён. подскажите плз почему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru