![]() |
|
Модераторы: bsa |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Почему такой код
вызывает такие ошибки Error 1 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' c:\program files\microsoft visual studio 9.0\vc\include\sstream 451 Test_ostringstream Error 2 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' c:\program files\microsoft visual studio 9.0\vc\include\ostream 584 Test_ostringstream ? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
почитай о требованиях к классу исключения, исключение должно иметь конструктор копирования и оператор присваивания
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
А как можно это обойти в данном случае?
И почему я могу throw-ить произвольный свой класс без таких операторов? Вот так работает:
|
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
А можно через проверку?
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
потому что у исключения другое время жизни, нежели у переменной определенной в блоке, ну а чтоб задать новую длину жизни необходимо уметь копировать его, о чем и сказано в цитате Lazin`a Потому что имеются нужные операторы .. некоторые операторы добавляются скрыто в случае если не определены программистом.. те что требуются относятся к числу подобных. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Непонятно.
Во-первых, какими образом и с какой целью достигнуто, чтобы ostringstream нельзя было копировать? Во-вторых, почему тогда вот это компилируется нормально:
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
компилятор же говорит : для того чтоб исключить возможное копирование из за невозможности разделения владения данными, можно либо запретить копирования, либо расшарить внутренние данные. второе требует дополнительных ресурсов плюс для этой задачи излишне, поэтому выбор пал на первое а это вопрос к VS |
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Dims, а ты попробуй такой код:
Это сообщение отредактировал(а) bsa - 5.3.2010, 01:09 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
чтоб можно было начать объяснять результаты, надо ко всем классам имеющим закрытый констуктор копий добавить открытый конструктор по умолчанию. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Первый пример: ругается линкер: Error 1 error LNK2001: unresolved external symbol "private: __thiscall A::A(class A const &)" (??0A@@AAE@ABV0@@Z) Test_ostringstream.obj Test_ostringstream Ошибка понятна: конструктор объявлен, вызывается, но не определён. Второй пример: не ругается. Понятно: хотя конструктор не определён, но он и не используется. Третий пример: ругается компилятор: Error 1 error C2248: 'A::A' : cannot access private member declared in class 'A' А какое это имеет отношения к моему примеру? Добавлено через 3 минуты и 28 секунд Ребят, скажите пожалуйста, откуда вообще всплыла эта тема? Судя по моей проверке вот тут: http://forum.vingrad.ru/index.php?showtopi...t&p=2109522 В классе ostringstream присутствуют и доступны как конструктор копирования по ссылке, так и оператор присваивания. Поэтому почему вы думаете, что дело в их отсутствии? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
А если так:
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Написал нижеследующим образом и получаю всё равно такую же ошибку. Почему?
Добавлено через 6 минут и 23 секунды Да, так похоже. Кое-что проясняется: ошибка возникает в коде, который генерирует сам компиллятор. Но понятно не всё Почему мой 2-й пример компилируется? Ладно, это особенности ВС. А почему мой последний не компилируется? Ведь я, вроде, написал что ему надо. |
|||
|
||||
| bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Почему нельзя написать так?
И вообще, наследовать подобные классы не есть хорошо. лучше использовать агрегацию:
|
||||||||
|
|||||||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
причина имеет те же корни
может немножко помягче написать то же самое : http://codepad.org/yuAzPD23 ? Добавлено через 59 секунд
а bsa уже сказал оказывается Добавлено через 2 минуты и 21 секунду по идеи должен быть варнинг предупреждающий о "скрытом" раскрытии закрытого конструктора копии.. проверять сейчас уже времени нет |
||||||
|
|||||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Какого кода и на какой системе? Те же корни -- это какие? Вот этих
корней больше нет.
Это понятно. Вопрос уже в теории: почему не компилируется код? Добавлено через 5 минут и 42 секунды Да, бред какой-то. На Виндах не компилируется, а на Линуксе компилируется. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
приведите сообщение об ошибке .. интуитивно полагаю, что проблема в а точнее в том, как это действие интерпретирует Ваш компилятор.
А вы уверены что Вы освободили эти корни Это сообщение отредактировал(а) mes - 5.3.2010, 18:44 |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Ниже сообщение. Возникает ДВЕ ошибки:
Error 1 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sstream 451 Test_ostringstream2 Error 2 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' C:\Program Files\Microsoft Visual Studio 9.0\VC\include\ostream 584 Test_ostringstream2 Код такой:
Добавлено через 3 минуты и 20 секунд О, чё на сайте говорит: http://codepad.org/8pIjcxuu |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ostringstream не предназначен для наследования
использовать в качестве исключений, нужно классы - наследники std::exception, иначе будет невозможно в одном catch обрабатывать любые исключения, а так-же, если в конструкторе копирования вашего исключения будет брошено другое исключение - будет вызвана ф-я terminate у basic_ios, скорее всего закрытый конструктор копирования, что не удивительно, поэтому ваш код не компилируется |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
На Линуксе мой код компилируется:
|
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
http://cplusplus.com/reference/iostream/ostringstream/
поищите там конструктор копирования там другая реализация STL, даже если компилируется, зачем вам использовать ostringstream вместо исключения? |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Более полная проверка на Линуксе:
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну раз код вызывает такие ошибки, то вопрос к компилятору ..
это логичное следствие, о котором как раз и предполагалось. точнее не предназначен для того чтоб быть исключением. и компилируется ли на линуксе или нет значения не играет |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Зато конструктор копирования есть в моём классе. Вы не заметили? Там есть конструктор копирования в ostringstream? Почему бы и нет? Я уже объяснял, я хочу таким способом составлять сообщения об ошибке. Это удобнее, чем складывать string-и, так как для operator<< больше определений. Добавлено через 4 минуты и 17 секунд Тогда об чём мы толкуем уже битый день? Есть на форуме компилятор, пусть ответит на мой вопрос? Объясните. Что означает это сообщение с codepad, как его понимать? |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
мы толкуем о том, что так делать не "красиво" , а Вы о том что Вам надо, к сожалению не заметив предложенный Вам вариант удовлетворяющий как Вашим , так и компиляторным требованиям Т.е. Вы хотите писать компиляторо-зависимый код ? a может лучше написать по правилам
и не только мы, а также и компилятор оно говорит о том, что хотя у Вашего наследника и открытый конструктор копий, но действие не совсем законно, так как предок желал быть не копированным так как его конструктор копий закрыт. Т.е. другими словами компилятор ловит Вас на "жульничестве" Eще раз повторюсь, что если посмотрите выше найдете пример, позволяющий сделать законно и без напряга то что Вы хотите. |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
По каким? Понимаете, дуть на воду я и сам умею. Назовите правило, которое я нарушил в своём примере.
В чём же ошибка? Конструктор копирования у меня есть, присваивание у меня есть. Имею право throw-ить. Не могу согласиться. Язык не требует у меня, чтобы я в копирующем конструкторе наследника вызывал именно копирующий конструктор предка (а не какой-либо другой). Следовательно, если логика моей задачи позволяет в копирующем конструкторе инициализировать базовый класс по-другому, я могу это сделать и никакого жульничества тут нет. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Я полагаю, это высказывание основано на умозаключении что все конструкторы одинаковы. К сожалению это не так, и конструктор копий особый среди констукторов, а копирования рассматривается как отдельная тема.
12.8/14
Следовательно : Это сообщение отредактировал(а) mes - 5.3.2010, 22:44 |
||||||
|
|||||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Ошибочно полагаете. Это утверждение основано на том, что не возникает ошибки, если в копирующем конструкторе инициализировать базовый класс не копирующим, а другим конструктором. Мой случай под это не подпадает, так как я не использую неявно недоступную специальную функцию. Так что не убедили. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ваш конструктор копирования может бросить исключение во время раскрутки стека и завалить все приложение, теперь убедил?
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Это относится к любому конструктору копирования, а не только к моему. Вы же сами сказали: чтобы объект можно было бросать, у его класса должен быть конструктор копирования и оператор присваивания. Эти условия выполнены. Так какого же х..а? Добавлено через 7 минут и 23 секунды Поставим вопрос по другому: кто-нибудь может сказать, что именно в данный момент делает компилятор, что у него не выходит? Вот по третьему примеру отсюда http://forum.vingrad.ru/index.php?showtopi...t&p=2109551 я понимаю так: компилятор создаёт объект A(), а затем пытается инициализировать a ссылкой на него; он видит, что конструктор по ссылке приватный и выдаёт ошибку. Вот по этому примеру http://forum.vingrad.ru/index.php?showtopi...t&p=2110227 я понимаю так: поскольку в классе B отсутствует копирующий конструктор, компилятор составляет его сам; там он пишет, мол, вызвать копирующий конструктор базового класса; а он у нас приватный приватный -- бац -- ошибка Как можно подобным образом объяснить ошибку в моём случае? |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
если есть, то имеете, но обращаться к закрытым членам класса это права не дает такого
у вас bad_alloc может быть брошено |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Да Вы не используете, но
так что сжульничать не получится
если этот вопрос и теперь актуален, то я могу в грубом примере пояснить что происходит Это сообщение отредактировал(а) mes - 6.3.2010, 01:44 |
||||||
|
|||||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Где я к ним обращаюсь, какой номер строки?
Не понимаю этой фразы.
Конечно, прошу Вас. Добавлено через 14 минут и 5 секунд То есть, Вы дополняете свои первоначальные требования? Теперь их список таков: 1) класс должен иметь копирующий конструктор 2) класс должен иметь оператор присваивания 3) класс не должен мочь выбросить bad_alloc так? Вот контрпример, он компилируется, хотя условие 3 нарушено
|
||||||
|
|||||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
А так в общем случае:
Это сообщение отредактировал(а) Леопольд - 6.3.2010, 01:10 -------------------- вопросов больше чем ответов |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Конструктор копии используется даже тогда, когда реализация фактически обходит его использование. Вот иллюстрация сказанного:
раскомментируйте "private:" для получения ошибки, не смотря на то что реализация не использует конструктор копии класса А. Добавлено @ 01:22 нет, пункт 3 не по теме. Это сообщение отредактировал(а) mes - 6.3.2010, 01:42 |
|||
|
||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Как же она его не использует, когда он используется в макросе __CHECK_COPYABLE? Я не вижу тут никакого неявного использования -- тут есть явное. Ха! Ну и что, что мы не знаем? В макросе вызывается копирующий конструктор, его вызов присутствует, в него можно ткнуть пальцем. А ткните-ка пальцем, где копирующий конструктор базового класса используется в моём примере?
Почему тогда компилируется другой пример, где нет throw? Добавлено через 5 минут и 8 секунд Ха! А вот такой код:
Работает. Проверил на VS и codepad: http://codepad.org/TViM3EQq |
||||||
|
|||||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
copy elision - это такая оптимизация, компилятор, в некоторых случаях может не копировать объект, передаваемый в качестве параметра или возвращаемый из функции, а использовать уже существующий
во первых не только bad_alloc, а любое исключение, во вторых, компилятор это никак не контролирует, просто твое приложение может упасть во время обработки какого-нибудь исключения вообще, я не понимаю, почему не компилируется твой код, у меня нет под рукой компилятора, что-бы в этом разобраться, ясно только то, что происходит обращение к закрытому члену класса, где именно я не знаю я бы на вашем месте, посмотрел на реализацию bsa, только унаследовал бы класс от std::exception |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
А, ну это понятно: оптимизация никогда не должна сказываться на логике.
Да я уже давно написал при помощи агрегации; теперь мне просто интересно, почему так себя ведёт компилятор в данном случае. |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
так о том и речь : Наша реализация обходит использование копи-конструктора, но он все равно используется компилятором. т.е несмотря на программисту не нужен, компилятор его проверяет.
Ну-ка ткните пальцем
Это сообщение отредактировал(а) mes - 6.3.2010, 12:56 |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
компилируется не значит работает еще раз для закрепления :
и вообще некрасиво разрешать наследнику копирование, когда открытая база запрещает.. нарушение логики при приведении. Это сообщение отредактировал(а) mes - 6.3.2010, 14:45 |
||||
|
|||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Хорошо, Вы правы, проверяется доступность. Но конструктор явно упоминается в выражении. Пример полностью аналогичен нижеследующему:
То есть, вы просто пытаетесь получить свойство члена, вам недоступного. Тут ни причём копирующие конструкторы и throw. Такой код всегда будет вызывать ошибку. И место, в котором это происходит, можно указать пальцем (см. комментарий). Можете проделать то же самое с моим примером с ostringstream? |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
с той лишь разностью, что в Вашем случае проверка осуществляется программистом, а в моем компилятором, и мой код лишь грубая иллюстрация проверки. сейчас я на секундочку заскочил, вернусь - попробую разобраться, что Вы просите проделать .. если что, может перефразируете, что именно не понятно, так как мне кажется что нить Вашей логики я упустил.. Это сообщение отредактировал(а) mes - 6.3.2010, 16:17 |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Я нашёл, в чём глюк. Ниже код.
Классы D и E оба наследуют от A (причём, D делает это косвенно и имея A виртуальным предком). В A конструктор копирования приватный (для всех), но это не мешает копировать и присваивать как D, так и E, так как в них определены свои конструкторы. Однако, стоит применить throw, возникает ошибка, причём только для класса D. Отсюда следует, что ошибка возникает в коде компиллятора, который он составляет, когда у него есть виртуальный предок...
Добавлено через 7 минут и 43 секунды P.S. Конечно, я забыл return *this; в операторе присваивания... Проверка компилятором codepad подтверждает гипотезу, что я напал на след: http://codepad.org/Otzbacg6 Компилятор тут показывает ошибку точнее, чем VS, но и здесь ошибочным является только код D, но не E. Осталось ещё разобраться, как удовлетворить "should be explicitly initialized in the copy constructor", ну и понять, откуда это требование возникает... Добавлено через 9 минут и 7 секунд
Не понял. Обоснуйте это утверждение. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
...
Это сообщение отредактировал(а) mes - 6.3.2010, 19:23 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
перечитал еще раз топик, вроде разобрался где свернули в разные стороны.
сейчас объясню. Добавлено @ 19:15
вот тут Вас интересует почему возникает ошибка компиляции, а не почему так нельзя делать.
вот теперь компилируется : http://codepad.org/dSptN7Fb, но за работоспособность не ручаюсь - не настолько хорошо знаю язык , в душе и по обоснованиям изложенных выше полагаю что ill formed ответ устраивает или я опять не на то ответил ? Это сообщение отредактировал(а) mes - 6.3.2010, 19:20 |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |