8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
1 | ||||||
[template] почему код не компилируется без конструктора15.03.2017, 18:53. Показов 1371. Ответов 5
Метки нет (Все метки)
добрый вечер.
вопрос поместил прямо в коде. http://rextester.com/AESO94403
0
|
15.03.2017, 18:53 | |
Ответы с готовыми решениями:
5
Почему не компилируется код Инициализация с помощью конструктора без параметров. Почему не нужны скобки? Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает О специализации шаблона: почему код компилируется? |
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
15.03.2017, 19:36 | 2 |
Но это же очевидно. A и const A - не один и тот же тип, поэтому если B - шаблон класса, то B<A> и B<const A> - уже совсем разные типы, независимые друг от друга и друг с другом не связанные. Приведение из одного в другой придётся писать явно. А лучше подсуетиться снаружи и снимать const с параметра шаблона.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
15.03.2017, 23:14 [ТС] | 3 | |||||
не константная версия:
class iterator: public detail::iterator<Container> в итоге унаследуется от:
template<class Container, dFOR_CONST> class iterator поэтому, очевидно, что не константная версия - наследник от константной. почему не срабатывает неявное приведение к предку?
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
16.03.2017, 03:52 | 4 |
hoggy, В принципе, Nick Alte, все правильно сказал. Это
detail::iterator<vec> и detail::iterator<const vec> находятся в одной иерархии. А вот ::iterator<vec> и ::iterator<const vec> - нет.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
16.03.2017, 12:36 [ТС] | 5 | ||||||||||
нет, не правильно.
::iterator<vec> унаследован от detail::iterator<const vec> ::iterator<const vec> унаследован от detail::iterator<const vec> detail::iterator<const vec> имеет конструктор копии. при запуске функции, которая принимает ссылку на базовый классс, прямой наследник должен быть неявно к нему приведен. поэтому, ::iterator<vec> должен был быть приведен к detail::iterator<const vec> следующий код иллюстрирует это положение: http://rextester.com/YKFOX52726
и non_const_iterator неявно кастится к iterator если бы iterator и non_const_iterator не были бы связанны прямыми родственными узами, мы бы получили ошибку компиляции: iterator не имел бы права залезть в приватные данные non_const_iterator однако, non_const_iterator успешно кастится к iterator, а iterator доступны приватные данные других iterator так что вопрос остается в силе: зачем был нужен явный конструктор, если оно итак может и должно кастиццо к предку?
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||||||
16.03.2017, 17:06 | 6 | |||||
Сообщение было отмечено hoggy как решение
Решение
В каком месте оно должно каститься?
Вот ваш код, упрощенный до предела:
A(const A&) превратится в C(const C&) , как сказано в A(const B&) который унаследуется в C без изменений. Ответ остается тем же. Классы не в одной иерархии.
3
|
16.03.2017, 17:06 | |
16.03.2017, 17:06 | |
Помогаю со студенческими работами здесь
6
Компилируется без ошибок, но командная строка, почему то, сразу же закрывается Как работает данный код? И почему не компилируется? Почему указанный код не компилируется в Visual Studio? Объяснить почему компилируется этот код (динамические массивы) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |