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

[C++] В чём тут ошибка? (делаю конструктор-копировщик) - C++

Восстановить пароль Регистрация
 
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
16.12.2009, 03:58     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #1
Пытаюсь написать класс с конструктором-копировщиком.В чём тут ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  class Subroutine {
     public:
        Subroutine (){};
        Subroutine (const Subroutine& copy) : _name (copy._name),
                                 params (new vector <expr_Node_t *> (copy.params->size()))
        {
           std::copy (copy.params->begin(),
                      copy.params->end() + copy.params->size(), params);
        }
       ~Subroutine () { delete params;};
 
        string name() const {return _name;};
        void setName (const string  *const s) {_name = *s;};
 
        void pushParam (expr_Node_t *expr) {
           params->push_back(expr);
        }
     private:
        string _name;
        vector <expr_Node_t *> *params;
  };
Получаю ошибки:
Ошибки
Код
/usr/include/c++/4.3/bits/stl_algobase.h|396|instantiated from ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false, _II = expr_Node_t**, _OI = std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >*]’|
/usr/include/c++/4.3/bits/stl_algobase.h|435|instantiated from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false, _II = __gnu_cxx::__normal_iterator<expr_Node_t**, std::vector<expr_Node_t*, std::allocator<expr_Node_t*> > >, _OI = std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >*]’|
/usr/include/c++/4.3/bits/stl_algobase.h|466|instantiated from ‘_OI std::copy(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator<expr_Node_t**, std::vector<expr_Node_t*, std::allocator<expr_Node_t*> > >, _OI = std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >*]’|
/home/user/Interpreter/function.h|50|instantiated from here|
/usr/include/c++/4.3/bits/stl_algobase.h|342|error: no match for ‘operator=’ in ‘* __result = * __first’|
||=== Build finished: 1 errors, 0 warnings ===|
и среда указывает сюда
кусок из stl_algobase.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  template<>
    struct __copy_move<false, false, random_access_iterator_tag>
    {
      template<typename _II, typename _OI>
        static _OI
        __copy_m(_II __first, _II __last, _OI __result)
        { 
      typedef typename iterator_traits<_II>::difference_type _Distance;
      for(_Distance __n = __last - __first; __n > 0; --__n)
        {
          *__result = *__first; // Вот на эту строку.
          ++__first;
          ++__result;
        }
      return __result;
    }
    };
Мне нужно перегрузить оператор '=' для класса? Я же копирую контейнер,размер элементов известен в памяти,вроде бы какая разница для STL,что там копируется.. Объясните,отчего ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2009, 03:58     [C++] В чём тут ошибка? (делаю конструктор-копировщик)
Посмотрите здесь:

C++ В чём тут ошибка?
C++ В чём тут ошибка?
конструктор-копировщик ошибка C++
Конструктор-копировщик C++
Конструктор копировщик C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
 Аватар для R0mm
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
16.12.2009, 06:42     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #2
мб params = new ...
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
16.12.2009, 06:57  [ТС]     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #3
Так ведь эта строка и есть
C++
1
params (new vector <expr_Node_t *> (copy.params->size()))
вызов конструктора для params.Или я не прав?
R0mm
Псевдо программист
 Аватар для R0mm
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
16.12.2009, 07:03     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #4
#pragma, это первое что в голову пришло..
ошибка при компиляции? или при исполнении?
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
16.12.2009, 07:33  [ТС]     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #5
Ой,а ведь params это не экземпляр класса,а вектор,тогда какой конструктор? Хотя.. такое ведь возможно
C++
1
int a(2);
Там ведь,наверное,внутреннее представление типов в компиляторе и всё такое.Ох,что-то я не пойму ...
R0mm
Псевдо программист
 Аватар для R0mm
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
16.12.2009, 09:05     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #6
конструктор при создании же вызывается.
а у тебя я так понимаю указатель params уже создан..
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
16.12.2009, 16:32  [ТС]     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #7
C++
1
 params = new expr_List_t (copy.params->size());
Так тоже не работает - та же ошибка.
Код
stl_algobase.h|342|error: no match for ‘operator=’ in ‘* __result = * __first’|
Может,надо определить оператор '=' для элемента вектора?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
16.12.2009, 19:59     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #8
Сразу видна ошибка в вызове std::copy: передавай ей не params, а *params. Кроме того, попытка передать ей в качестве итератора для последнего элемента не просто end, а end + size вызывает крайнее недоумение по поводу выхода за границы массива.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
16.12.2009, 21:52  [ТС]     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #9
Вот,я переделал таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  class Subroutine {
     public:
        Subroutine (){};
        Subroutine (const Subroutine& copy) : _name (copy._name),
                                 params (new vector <expr_Node_t *> (copy.params->size()))
        {
           std::copy (copy.params->begin(),
                      copy.params->end(), *params);
        }
       ~Subroutine () { delete params;};
 
        string name() const {return _name;};
        void setName (const string  *const s) {_name = *s;};
 
        void pushParam (expr_Node_t *expr) {
           params->push_back(expr);
        }
     private:
        string _name;
        vector <expr_Node_t *> *params;
  };
Теперь выдаётся такая ошибка(и):
ошибки
Код
/usr/include/c++/4.3/bits/stl_algobase.h|388|instantiated from ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false, _II = expr_Node_t**, _OI = std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >]’|
/usr/include/c++/4.3/bits/stl_algobase.h|435|instantiated from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false, _II = __gnu_cxx::__normal_iterator<expr_Node_t**, std::vector<expr_Node_t*, std::allocator<expr_Node_t*> > >, _OI = std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >]’|
/usr/include/c++/4.3/bits/stl_algobase.h|466|instantiated from ‘_OI std::copy(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator<expr_Node_t**, std::vector<expr_Node_t*, std::allocator<expr_Node_t*> > >, _OI = std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >]’|
/home/user/Interpreter/function.h|50|instantiated from here|
/usr/include/c++/4.3/bits/stl_iterator_base_types.h|133|error: no type named ‘iterator_category’ in ‘class std::vector<expr_Node_t*, std::allocator<expr_Node_t*> >’|
||=== Build finished: 1 errors, 0 warnings ===|
И указывает на этот кусок кода:
stl_iterator_base_types.h
C++
1
2
3
4
5
6
7
8
9
  template<typename _Iterator>
    struct iterator_traits
    {
      typedef typename _Iterator::iterator_category iterator_category; // На эту строку
      typedef typename _Iterator::value_type        value_type;
      typedef typename _Iterator::difference_type   difference_type;
      typedef typename _Iterator::pointer           pointer;
      typedef typename _Iterator::reference         reference;
    };
Я понимаю,что не знаю каких-то элементарных вещей,просто хотя бы понять суть ошибки,там уже я сам докопаюсь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2009, 18:42     [C++] В чём тут ошибка? (делаю конструктор-копировщик)
Еще ссылки по теме:

C++ Виртуальный конструктор копировщик.
в чём тут ошибка? C++
C++ Конструктор-копировщик

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.12.2009, 18:42     [C++] В чём тут ошибка? (делаю конструктор-копировщик) #10
Третьим параметром в std::copy надо передавать не сам контейнер, а итератор элемента, начиная с которого будет произведено копирование. То есть,
C++
1
2
           std::copy (copy.params->begin(),
                      copy.params->end() + copy.params->size(), params->begin());
Yandex
Объявления
17.12.2009, 18:42     [C++] В чём тут ошибка? (делаю конструктор-копировщик)
Ответ Создать тему
Опции темы

Текущее время: 11:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru