![]() |
|
Модераторы: bsa |
![]()
|
|
| 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-ить. Не могу согласиться. Язык не требует у меня, чтобы я в копирующем конструкторе наследника вызывал именно копирующий конструктор предка (а не какой-либо другой). Следовательно, если логика моей задачи позволяет в копирующем конструкторе инициализировать базовый класс по-другому, я могу это сделать и никакого жульничества тут нет. |
|||
|
||||
![]()
|
| Правила форума "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. |