Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550

Встроенный оператор C++ откликается при перегрузке

23.04.2010, 14:05. Показов 2084. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот возникает ошибочка, кажется я понимаю почему
C++
1
2
    List<int> abc;
    abc << 1 << 5;
List<data_type>::operator >>: для 2 перегрузок есть подобные преобразования
может быть 'List<data_type> &List<data_type>::operator >>(data_type *)'
или 'встроенный оператор C++>>(int, int)'
Имеется у списка собственно
C++
1
LIST& operator >> (data_type* savedata_type);
но и
C++
1
operator data_type&();
т.е. преобразование
Когда список хранит int или другие целочисленные данные видимо и возникает спорный момент использовать сдвиг для преобразованных данных или применить метод >> (к << это тоже относится)

Как выйти из этого положения? Не хотелось бы убирать методы >> << и преобразование потому как все это удобно
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2010, 14:05
Ответы с готовыми решениями:

Ошибка при перегрузке +
Что не так? error C2601: Matrica::operator +: недопустимые локальные определения функций #pragma once class Matrica { public: ...

Ошибка при перегрузке операторов
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; class fraction { public: int numerator; int denominator; fraction(); ...

Предупреждение при перегрузке оператора
Есть вот такой код для созданный для обучения #include &lt;iostream&gt; using namespace std; class complex{ private: ...

16
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
23.04.2010, 14:45
C++
1
(abc << 1) << 5;
?
0
12 / 12 / 3
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 15:14
А текст ошибки можно?

Добавлено через 8 минут
Просто судя по

C++
1
LIST& operator >> (data_type* savedata_type);
этот оператор просто не может сработать при

C++
1
2
3
List myList;
 
myList << 5;
только в таком виде

C++
1
2
3
4
List myList;
 
int i = 5;
myList << &i;
хотя, я может и хрень сказал
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
23.04.2010, 19:01  [ТС]
CheshireCat, даже если 1 параметр посылается принимается через << >> эта ошибка возникает. Видимо оно неоднозначно потому как может быть преобразовано в int или другой примитивный тип и после сдвинуто стандартно...
Seishin, я немного попутал, ф-я добавление в список выглядит так
C++
1
LIST& LIST::operator << (const data_type& newdata_type);
Но ошибка возникает и при << и при >> и связана с тем что List имеет преобразование к хранимому типу...
0
12 / 12 / 3
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 19:14
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
template <class data_type> 
class List
{
public:
 
    List& operator << (const data_type& newdata_type)
    {
        iSomeData = newdata_type;
        return *this;
    }
 
    data_type  iSomeData;
};
 
typedef unsigned char point_dist;
template <class data_type = point_dist> class point
{
 
};
 
 
void main()
{
    List<int> lMyList;
    lMyList << 3 << 6;
}
тогда чтот не втыкаю , что же не пашет
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
23.04.2010, 19:45  [ТС]
Seishin, в лист operator data_type&(); если добавить то он будет пытаться преобразовываться сам
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
23.04.2010, 19:56
Тогда у тебя возникает конфликт, который компилятор не может разрешить самостоятельно......
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
23.04.2010, 20:15  [ТС]
Seishin, а ведь странно, добавил в ваш код преобразование и все нормально... буду думать


CheshireCat, вот мне бы его хотя бы вручную разрешить с минимумом потерь...

Добавлено через 12 минут
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
57
58
59
60
61
62
63
64
    #define TEMPLATE template <class data_type>
    #define LIST List<data_type>
 
    #include "Node.h"
 
    enum ADAPT_MODE{    BEFORE, AFTER       };
 
    TEMPLATE    class List{
    friend class Node;
        Node* Parent; // Родоначальный нод
        Node *Head, *Tail; // Начало и конец списка
 
        Node* CurrentNode; // для перемещения по списку
        size_t Count; // количество элементов в списке (без учета вложенных списков)
 
        // Вспомогательные функции помогающией переходить
        static Node* Wrest(Node* Whole);
        static Node* Adapt(LIST*const _this, Node* Adaptive, Node* Friend, ADAPT_MODE Mode);
        void Wash(Node* Dirty);
 
        Node* GetTail();
        Node* GetHead();
 
        Node* AllocNode(const data_type* newdata_type);
        void FreeNode(Node* Died);
    protected:
        static LIST& NodeParent(Node* Source);
        static LIST& NodeChild(Node* Source);
    public:
        // Перемещение по списку
        LIST& operator ++(int);                 // CurrentNode = CurrentNode->Next;
        LIST& operator --(int);                 // CurrentNode = CurrentNode->Prev;
        LIST& Set(long int Offset); // CurrentNode = ->CurrentNode->Next->Next->...[Offset]...->Next;
        LIST& Set(data_type& SearchData); // находит внутренние данные по их указателю 
        data_type& Get (long int Offset, bool Overwrite = false);
        bool EOL();
 
        data_type& operator [] (long int Offset);   // CurrentNode->Next->Next->...[Offset]...->Next->Data;
        data_type* operator ->();               // return CurrentNode->data_type;
 
        bool operator == (const data_type& Data);       // return (*CurrentNode->Data != Data);
        bool operator != (const data_type& Data);       // return (*CurrentNode->Data == Data);
        bool operator == (const data_type* pData);      // return (CurrentNode->Data != pData);
        bool operator != (const data_type* pData);      // return (CurrentNode->Data == pData);
 
 
        // Добавление данных в список после текущего нода
        LIST& operator << (const data_type& newdata_type);
        // Удаляет текущий нод из списка
        LIST& operator >> (data_type*const savedata_type);
 
        LIST& Childs(); // return CurrentNode->Childs()
 
        size_t GetCount();
 
        // Получение данных
        data_type* pData();
        data_type& Data();
        //operator data_type&();
 
        LIST();
        ~LIST();
        size_t Clear(long int Amount = -1, long int Offset = -1, bool Relative = false);
    };
Вызов:
C++
1
2
    List<char> abc;
    abc << 1;
Когда убираю из List
C++
1
operator data_type&();
То ошибка исчезает...
0
12 / 12 / 3
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 21:10
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#define TEMPLATE template <class data_type>
#define LIST List<data_type>
 
//#include "Node.h"
 
enum ADAPT_MODE{        BEFORE, AFTER           };
 
TEMPLATE  class List
{
    friend class Node;
    Node* Parent; // Родоначальный нод
    Node *Head, *Tail; // Начало и конец списка
 
    Node* CurrentNode; // для перемещения по списку
    size_t Count; // количество элементов в списке (без учета вложенных списков)
 
    data_type TestDT;
 
    // Вспомогательные функции помогающией переходить
    static Node* Wrest(Node* Whole);
    static Node* Adapt(LIST*const _this, Node* Adaptive, Node* Friend, ADAPT_MODE Mode);
    void Wash(Node* Dirty);
 
    Node* GetTail();
    Node* GetHead();
 
    Node* AllocNode(const data_type* newdata_type);
    void FreeNode(Node* Died);
protected:
    static LIST& NodeParent(Node* Source);
    static LIST& NodeChild(Node* Source);
public:
    // Перемещение по списку
    LIST& operator ++(int);                                 // CurrentNode = CurrentNode->Next;
    LIST& operator --(int);                                 // CurrentNode = CurrentNode->Prev;
    LIST& Set(long int Offset);     // CurrentNode = ->CurrentNode->Next->Next->...[Offset]...->Next;
    LIST& Set(data_type& SearchData); // находит внутренние данные по их указателю 
    data_type& Get (long int Offset, bool Overwrite = false);
    bool EOL();
 
    data_type& operator [] (long int Offset);       // CurrentNode->Next->Next->...[Offset]...->Next->Data;
    data_type* operator ->();                               // return CurrentNode->data_type;
 
    bool operator == (const data_type& Data);               // return (*CurrentNode->Data != Data);
    bool operator != (const data_type& Data);               // return (*CurrentNode->Data == Data);
    bool operator == (const data_type* pData);              // return (CurrentNode->Data != pData);
    bool operator != (const data_type* pData);              // return (CurrentNode->Data == pData);
 
 
    // Добавление данных в список после текущего нода
    LIST& operator << (const data_type& newdata_type)
    {
        TestDT = newdata_type;
        return *this;
    }
    // Удаляет текущий нод из списка
    LIST& operator >> (data_type*const savedata_type);
 
    operator data_type&()
    {
        return TestDT;
    }
 
    LIST& Childs(); // return CurrentNode->Childs()
 
    size_t GetCount();
 
    // Получение данных
    data_type* pData();
    data_type& Data();
    //operator data_type&();
 
    LIST(){}
    ~LIST(){}
    size_t Clear(long int Amount = -1, long int Offset = -1, bool Relative = false);
};
 
void main()
{
  List<int> lMyList;
    lMyList<<5<<7;
 
    int lCastVal = lMyList;
}
вроде и приведение к типу работает и <<
либо я тупо не втыкаю в вопрос и на чем то своем завис ((
1
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
23.04.2010, 21:43
вот как надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <list>
#include <iostream>
using namespace std;
template <typename T> class List: public list<T>{
public:
    friend List<T> &operator << (List<T>& L,const T &x)
    {
        L.push_back(x);
        return L;
    }
};
int main()
{
    List<int> L;
    L << 3 << 6 << 1;
    int x=24;
    L << x;
    for (List<int>::iterator i=L.begin();i!=L.end();i++) cout << *i << '\t';
    cout << '\n';
    return 0;
}
т. е. надо перегрузить глобальный (как то так называется, я не помню уже, так что наверняка ошибся) опертаор <<. для этого не забыть его обявить другом List.
и зачем такие дефайны? что бы ничего не понятно было?
вобщем, оператор << должен создавть в конце списка еще один узел содержащий новое (вставляемое) значение. Мне лень было разбираться в твоем коде или описывать список самому, поэтому я всзял класс списка из стандартной библиотеки.
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
23.04.2010, 22:03  [ТС]
Seishin, да я вот и сам не пойму( чистый проект создаю ошибок нет, а так... есть


Цитата Сообщение от Aye Aye Посмотреть сообщение
и зачем такие дефайны? что бы ничего не понятно было?
Это мое первое использование шаблонов классов, даже не знаю почему взбрендило) Да да, страшное дело, как проблему решу - уберу

Добавлено через 2 минуты
Для глобального тоже самое...
полный текст ошибки
1> wayinside.cpp(203) : error C2666: operator <<: для 2 перегрузок есть подобные преобразования
1> list.h(16): может быть 'List<data_type> &operator <<(List<data_type> &,const data_type &)' [найдено при поиске с зависимостью от аргументов]
1> with
1> [
1> data_type=char
1> ]
1> или 'встроенный оператор C++<<(char, int)'
1> при попытке сопоставить список аргументов '(List<data_type>, int)'
1> with
1> [
1> data_type=char
1> ]
Глобально сделал так:
C++
1
2
    TEMPLATE    class List{
    friend LIST& operator << (LIST& L,const data_type& x);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    TEMPLATE
    LIST& operator << (LIST& L,const data_type& x)
    {
        
        return L;
    }
 
    TEMPLATE
    LIST& operator >> (LIST& L,const data_type* x)
    {
        
        return L;
    }
(конечно вне класса)

Вызов все тот же
C++
1
2
    List<char> abc;
    abc << 1;
Магия...
0
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
23.04.2010, 22:17
мой пример скомпилировался, запустился удачно? какой средой пользуешься? какой в ней компилятор? надо использовать, по возможности, только стандартные компиляторы.
а тут:
List<char> abc;
abc << 1;
с List<int> пробовал? ибо 1 это один не буква, компилятор моежет не найти функции с подходящей сигнатурой, лучше тогда char(1). а не найти потому что у тебя шаблон инстанцирован char'ом, а вызавать ты пытаешься << для int.

у меня мой вариант с char скомпилировался и вывел ожидаемый результат.
вот с char
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <list>
#include <iostream>
using namespace std;
template <typename T> class List: public list<T>{
public:
    friend List<T> &operator << (List<T>& L,const T &x)
    {
        L.push_back(x);
        return L;
    }
};
int main()
{
    List<char> L;
    L << 'e' << 'q' << '\'';
    char x='z';
    L << x;
    for (List<char>::iterator i=L.begin();i!=L.end();i++) cout << *i << '\t';
    cout << '\n';
    return 0;
}
на экране:
e q ' z

Process returned 0 (0x0) execution time : 0.171 s
Press any key to continue.
PS хотя у меня и
C++
1
L << 'e' << 1 << '\'';
сработало.
0
12 / 12 / 3
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 22:32
Aye Aye, ну тут и без friend нормально пашет :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <list>
#include <iostream>
using namespace std;
template <typename T> class List: public list<T>{
public:
    List<T> &operator << (const T &x)
    {
        push_back(x);
        return *this;
    }
};
int main()
{
    List<char> L;
    L << 'e' << 'q' << '\'';
    char x='z';
    L << x;
    for (List<char>::iterator i=L.begin();i!=L.end();i++) cout << *i << '\t';
    cout << '\n';
    return 0;
}
трабл похоже с конкретным проектом
0
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
23.04.2010, 22:44
Seishin, да но это другой <<, этот оператор перегружен в классе, а у меня "глобально". не важно вобщем.
у insideone компилятор не может разобраться с сигнатурами операторов. Надо другим компилятором попробовать. например Борландский билдер и "эта_фигня_под_DOS" довольно сильно (и в плохую сторону, с моей точки зрения) отличаются от стандарта.
0
12 / 12 / 3
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 23:54
insideone, под чем сидишь то?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
24.04.2010, 00:43  [ТС]
Используется Visual Studio 2008
0
12 / 12 / 3
Регистрация: 15.04.2010
Сообщений: 31
24.04.2010, 11:10
Мда..
И под 2003 и под 2008 и 2010 все норм...

Ну, тебе остается только проект весь выложить )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2010, 11:10
Помогаю со студенческими работами здесь

Ошибка при перегрузке оператора ==
У меня компилятор выдает ошибку error LNK2019: ссылка на неразрешенный внешний символ &quot;bool __cdecl operator==(class Time &amp;,class...

Ошибки при перегрузке операторов
Ну не могу,не получается самостоятельно разобрать свои ошибки(( Они по большей части повторяются. Помогите пожалуйста. ошибки...

Ошибки при перегрузке оператора <<
dc.cpp не видит private поля из dc.h dc.h #pragma once #include &lt;cmath&gt; class dc {

Ошибка при перегрузке оператора +
Имеется класс, который представляет из себя строку и количество символов в ней. Задача - перегрузить оператор +, чтобы он складывал нам две...

Конфликт при перегрузке операторов
Здравствуйте ,изучаю C++ и делая очередное задание столкнулся с проблемой (привожу код ниже) Компилятора Visual Studio 2017 . При...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru