Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
1

Шаблоны классов, перегрузка операторов, C2679

23.04.2019, 22:34. Показов 1375. Ответов 3
Метки нет (Все метки)

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>//для std::cin, std::cout
#include <cstdio>
#include <string>
#include <cstdlib>
using namespace std;
class foo {
public:
    char *s;
    foo(const char *other) {
        s = new char[strlen(other)];
        strcpy(s, other);
    }
    foo() {
 
    }
};
ostream &operator <<(ostream &op, foo &fp) {
    op << fp.s;
    return op;
}
template<typename T>
class structure {
public:
    T *arr;
    size_t id;
    size_t sz;
    size_t capacity;
    structure() {
        sz = 0;
        id = 0;
        capacity = 20;
        arr = new T[capacity];
    }
    void push(T elem) {
        if (id + 1 >= capacity) {
            capacity *= 2;
            arr = new T[capacity];
        }
        arr[id] = elem;
        id++;
        sz++;
    }
    T front() {
        if (sz > 0)
        return arr[0];
    }
};
int main() {
    foo s("aymurat");
    structure<foo> test;
    test.push(s);
    cout << s << endl;//работает
    cout << test.front();//не работает
    system("pause");//задерживаем консоль
    return 0;
}
Вылезает ошибка в строке 53:
Код
C2679	бинарный "<<": не найден оператор, принимающий правый операнд типа "T" (или приемлемое преобразование отсутствует)
Оператор << перегружен, для T = foo, почему ругается и как исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2019, 22:34
Ответы с готовыми решениями:

Шаблоны классов, перегрузка операторов
Задание:Реализовать шаблон классов Array. Перегрузить операторы присваивания =, ввода &gt;&gt; и вывода...

Перегрузка операторов и шаблоны
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas;...

Перегрузка операторов через шаблоны
Есть класс дробь, переопределил операторы (внутри класса). В таком случае (дробь оператор что-то)...

Шаблоны и перегрузка различных операторов
Не могу правильно описать шаблон при перегрузке операторов. Добился того,что не видит ошибок..но...

3
4048 / 2296 / 959
Регистрация: 07.02.2019
Сообщений: 5,991
23.04.2019, 22:57 2
Лучший ответ Сообщение было отмечено Aymurat как решение

Решение

Aymurat,
C++
1
ostream& operator<<(ostream& op, const foo& fp)
1
880 / 336 / 78
Регистрация: 17.05.2015
Сообщений: 1,051
23.04.2019, 23:12 3
Цитата Сообщение от Aymurat Посмотреть сообщение
Оператор << перегружен, для T = foo, почему ругается
Потому что grammar-const

Замените:
C++
1
2
3
4
ostream &operator <<(ostream &op, foo &fp) {
    op << fp.s;
    return op;
}
На:
C++
1
2
3
4
ostream &operator <<(ostream &op, const foo &fp) {
    op << fp.s;
    return op;
}
хотите знать больше?

Далее программа успешно скомпилируется.
Но рухнет при запуске:

краш
Код
Error(s):
*** buffer overflow detected ***: /var/www/service/usercode/337721899/a.out terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fa2d9ac77e5]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7fa2d9b6856c]
/lib/x86_64-linux-gnu/libc.so.6(+0x116570)[0x7fa2d9b66570]
/var/www/service/usercode/337721899/a.out[0x400955]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fa2d9a70830]
/var/www/service/usercode/337721899/a.out[0x4009e9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 b6:4f3a1 3045210                         /var/www/service/usercode/337721899/a.out
00600000-00601000 r--p 00000000 b6:4f3a1 3045210                         /var/www/service/usercode/337721899/a.out
00601000-00602000 rw-p 00001000 b6:4f3a1 3045210                         /var/www/service/usercode/337721899/a.out
00977000-009a9000 rw-p 00000000 00:00 0                                  [heap]
7fa2d9531000-7fa2d9547000 r-xp 00000000 b6:4f3a1 105                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa2d9547000-7fa2d9746000 ---p 00016000 b6:4f3a1 105                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa2d9746000-7fa2d9747000 rw-p 00015000 b6:4f3a1 105                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa2d9747000-7fa2d984f000 r-xp 00000000 b6:4f3a1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa2d984f000-7fa2d9a4e000 ---p 00108000 b6:4f3a1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa2d9a4e000-7fa2d9a4f000 r--p 00107000 b6:4f3a1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa2d9a4f000-7fa2d9a50000 rw-p 00108000 b6:4f3a1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa2d9a50000-7fa2d9c0f000 r-xp 00000000 b6:4f3a1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa2d9c0f000-7fa2d9e0f000 ---p 001bf000 b6:4f3a1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa2d9e0f000-7fa2d9e13000 r--p 001bf000 b6:4f3a1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa2d9e13000-7fa2d9e15000 rw-p 001c3000 b6:4f3a1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa2d9e15000-7fa2d9e19000 rw-p 00000000 00:00 0 
7fa2d9e19000-7fa2d9e31000 r-xp 00000000 b6:4f3a1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa2d9e31000-7fa2da030000 ---p 00018000 b6:4f3a1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa2da030000-7fa2da031000 r--p 00017000 b6:4f3a1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa2da031000-7fa2da032000 rw-p 00018000 b6:4f3a1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa2da032000-7fa2da036000 rw-p 00000000 00:00 0 
7fa2da036000-7fa2da1a8000 r-xp 00000000 b6:4f3a1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fa2da1a8000-7fa2da3a8000 ---p 00172000 b6:4f3a1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fa2da3a8000-7fa2da3b2000 r--p 00172000 b6:4f3a1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fa2da3b2000-7fa2da3b4000 rw-p 0017c000 b6:4f3a1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fa2da3b4000-7fa2da3b8000 rw-p 00000000 00:00 0 
7fa2da3b8000-7fa2da3de000 r-xp 00000000 b6:4f3a1 10838                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa2da5a9000-7fa2da5af000 rw-p 00000000 00:00 0 
7fa2da5da000-7fa2da5dd000 rw-p 00000000 00:00 0 
7fa2da5dd000-7fa2da5de000 r--p 00025000 b6:4f3a1 10838                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa2da5de000-7fa2da5df000 rw-p 00026000 b6:4f3a1 10838                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa2da5df000-7fa2da5e0000 rw-p 00000000 00:00 0 
7fff7fa9b000-7fff7fab0000 rw-p 00000000 00:00 0                          [stack]
7fff7fb1f000-7fff7fb21000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Abort signal from abort(3) (SIGABRT)
Помимо грубого нарушения правила трёх,
код содержит массу проблем:

тревожные колокольчики
Код
source_file.cpp: In constructor ‘foo::foo(const char*)’:
source_file.cpp:10:5: warning: ‘foo::s’ should be initialized in the member initialization list [-Weffc++]
     foo(const char *other) {
     ^
source_file.cpp: In constructor ‘foo::foo()’:
source_file.cpp:14:5: warning: ‘foo::s’ should be initialized in the member initialization list [-Weffc++]
     foo() {
     ^
source_file.cpp: In instantiation of ‘structure<T>::structure() [with T = foo]’:
source_file.cpp:59:20:   required from here
source_file.cpp:37:5: warning: ‘structure<foo>::arr’ should be initialized in the member initialization list [-Weffc++]
     structure() {
     ^
source_file.cpp:37:5: warning: ‘structure<foo>::id’ should be initialized in the member initialization list [-Weffc++]
source_file.cpp:37:5: warning: ‘structure<foo>::sz’ should be initialized in the member initialization list [-Weffc++]
source_file.cpp:37:5: warning: ‘structure<foo>::capacity’ should be initialized in the member initialization list [-Weffc++]
source_file.cpp: In member function ‘T structure<T>::front() [with T = foo]’:
source_file.cpp:55:5: warning: control reaches end of non-void function [-Wreturn-type]
     }
     ^
In file included from /usr/include/string.h:635:0,
                 from /usr/include/c++/5/cstring:42,
                 from source_file.cpp:4:
In function ‘char* strcpy(char*, const char*)’,
    inlined from ‘foo::foo(const char*)’ at source_file.cpp:12:25,
    inlined from ‘int main()’ at source_file.cpp:58:20:
/usr/include/x86_64-linux-gnu/bits/string3.h:110:63: warning: call to void* __builtin___memcpy_chk(void*, const void*, long unsigned int, long unsigned int) will always overflow destination buffer
   return __builtin___strcpy_chk (__dest, __src, __bos (__dest));
                                                               ^
2
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
23.04.2019, 23:24  [ТС] 4
eva2326, да, по совету одного доброго пользователя форума я начал переписывать воспроизводимую копию минимального характера, с остальными ошибками разберусь)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2019, 23:24

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг...

Перегрузка операторов для классов
Определить класс описывающий вектор в пространстве. Для класса перегрузить префиксный унарный...

Шаблоны классов, перегрузка operator<< класса ostream
Не компилируется программа. fatal error: 1 unresolved externals Как правильно определить...

Перегрузка операторов для наследованных классов
Есть один класс, для него определена операция сложения. Есть так же наследованный класс для него...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.