Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
#1

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

23.04.2010, 14:05. Просмотров 1132. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2010, 14:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Встроенный оператор C++ откликается при перегрузке (C++):

Перенаправление указателя при перегрузке оператора в variadic template - C++
Есть вот такой вот код (сделан в vs2014): #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; ...

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

Ошибка при перегрузке функций - C++
Помогите, пожалуйста. Вылетает ошибка floating point stack check на строчке 16 кода (код ниже). Summa.Real=a.Real+b.Real; Не могу понять,...

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

Ошибка при перегрузке оператора >> - C++
Приветствую. Есть 2 класса: enum Color { white = 1, red, green, blue, yellow }; class Shape { protected: Color figureCol; ...

Ошибка при перегрузке операторов. - C++
Здравствуйте! Возникла необходимость создать свой класс-обертку для работы с большими числами. Бибилиотека mpir=порт GMP. Пример рабочий:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
23.04.2010, 14:45 #2
C++
1
(abc << 1) << 5;
?
0
Seishin
12 / 12 / 2
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 15:14 #3
А текст ошибки можно?

Добавлено через 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
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
23.04.2010, 19:01  [ТС] #4
CheshireCat, даже если 1 параметр посылается принимается через << >> эта ошибка возникает. Видимо оно неоднозначно потому как может быть преобразовано в int или другой примитивный тип и после сдвинуто стандартно...
Seishin, я немного попутал, ф-я добавление в список выглядит так
C++
1
LIST& LIST::operator << (const data_type& newdata_type);
Но ошибка возникает и при << и при >> и связана с тем что List имеет преобразование к хранимому типу...
0
Seishin
12 / 12 / 2
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 19:14 #5
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
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
23.04.2010, 19:45  [ТС] #6
Seishin, в лист operator data_type&(); если добавить то он будет пытаться преобразовываться сам
0
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
23.04.2010, 19:56 #7
Тогда у тебя возникает конфликт, который компилятор не может разрешить самостоятельно......
0
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
23.04.2010, 20:15  [ТС] #8
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
Seishin
12 / 12 / 2
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 21:10 #9
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
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
23.04.2010, 21:43 #10
вот как надо:
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
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
23.04.2010, 22:03  [ТС] #11
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
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
23.04.2010, 22:17 #12
мой пример скомпилировался, запустился удачно? какой средой пользуешься? какой в ней компилятор? надо использовать, по возможности, только стандартные компиляторы.
а тут:
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
Seishin
12 / 12 / 2
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 22:32 #13
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
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
23.04.2010, 22:44 #14
Seishin, да но это другой <<, этот оператор перегружен в классе, а у меня "глобально". не важно вобщем.
у insideone компилятор не может разобраться с сигнатурами операторов. Надо другим компилятором попробовать. например Борландский билдер и "эта_фигня_под_DOS" довольно сильно (и в плохую сторону, с моей точки зрения) отличаются от стандарта.
0
Seishin
12 / 12 / 2
Регистрация: 15.04.2010
Сообщений: 31
23.04.2010, 23:54 #15
insideone, под чем сидишь то?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2010, 23:54
Привет! Вот еще темы с ответами:

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

Ошибка при перегрузке операторов - C#
public struct kletka { public int X, Y; } kletka kl; public static bool operator ==...

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

Выделение памяти при перегрузке - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #pragma warning(disable:4101) //--------------------------------- ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.04.2010, 23:54
Ответ Создать тему
Опции темы

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