|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
Конструкторы ofstream и стандарт C++11 и компилятор gcc необходимо разобраться26.09.2014, 13:16. Показов 4779. Ответов 46
Метки нет (Все метки)
Друзья! Условимся, что компилятор g++ поддерживает этот стандарт, ибо ошибок, говорящих об обратном не замечено вроде.
команда g++.exe main.cpp и простыня ошибок
C:\mingw32\bin>g++.exe main.cpp
In file included from C:/mingw32/i686-w64-mingw32/include/c++/ios:42:0, from C:/mingw32/i686-w64-mingw32/include/c++/istream:38, from C:/mingw32/i686-w64-mingw32/include/c++/fstream:38, from main.cpp:2: C:/mingw32/i686-w64-mingw32/include/c++/bits/ios_base.h: In copy constructor 'std::basic_ios<char>:: basic_ios(const std::basic_ios<char>&)': C:/mingw32/i686-w64-mingw32/include/c++/bits/ios_base.h:786:5: error: 'std::ios_base::ios_base(const std::ios_base&)' is private ios_base(const ios_base&); ^ In file included from C:/mingw32/i686-w64-mingw32/include/c++/ios:44:0, from C:/mingw32/i686-w64-mingw32/include/c++/istream:38, from C:/mingw32/i686-w64-mingw32/include/c++/fstream:38, from main.cpp:2: C:/mingw32/i686-w64-mingw32/include/c++/bits/basic_ios.h:66:11: error: within this context class basic_ios : public ios_base ^ In file included from main.cpp:2:0: C:/mingw32/i686-w64-mingw32/include/c++/fstream: In copy constructor 'std::basic_ofstream<char>::bas ic_ofstream(const std::basic_ofstream<char>&)': C:/mingw32/i686-w64-mingw32/include/c++/fstream:602:11: note: synthesized method 'std::basic_ios<cha r>::basic_ios(const std::basic_ios<char>&)' first required here class basic_ofstream : public basic_ostream<_CharT,_Traits> ^ In file included from C:/mingw32/i686-w64-mingw32/include/c++/ios:43:0, from C:/mingw32/i686-w64-mingw32/include/c++/istream:38, from C:/mingw32/i686-w64-mingw32/include/c++/fstream:38, from main.cpp:2: C:/mingw32/i686-w64-mingw32/include/c++/streambuf: In copy constructor 'std::basic_filebuf<char>::ba sic_filebuf(const std::basic_filebuf<char>&)': C:/mingw32/i686-w64-mingw32/include/c++/streambuf:802:7: error: 'std::basic_streambuf<_CharT, _Trait s>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char; _Traits = std ::char_traits<char>]' is private basic_streambuf(const basic_streambuf& __sb) ^ In file included from main.cpp:2:0: C:/mingw32/i686-w64-mingw32/include/c++/fstream:72:11: error: within this context class basic_filebuf : public basic_streambuf<_CharT, _Traits> ^ C:/mingw32/i686-w64-mingw32/include/c++/fstream: In copy constructor 'std::basic_ofstream<char>::bas ic_ofstream(const std::basic_ofstream<char>&)': C:/mingw32/i686-w64-mingw32/include/c++/fstream:602:11: note: synthesized method 'std::basic_filebuf <char>::basic_filebuf(const std::basic_filebuf<char>&)' first required here class basic_ofstream : public basic_ostream<_CharT,_Traits> ^ main.cpp: In function 'int main()': main.cpp:8:19: note: synthesized method 'std::basic_ofstream<char>::basic_ofstre am(const std::basic_ ofstream<char>&)' first required here ofstream of_(of); ^ C:\mingw32\bin>
0
|
||||||
| 26.09.2014, 13:16 | |
|
Ответы с готовыми решениями:
46
Почему компилятор не распознает тип ofstream? Компилятор не поддерживает в полной мере стандарт С++11 и выдает ошибку gcc/c++ компилятор |
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 26.09.2014, 13:48 | ||
|
1. Копировать поток нельзя по очевидным причинам. Следовательно, нужен механизм, запрещающий пользователю использовать операции копирования - конструктор копирования и оператор присваивания. 2. Для того, чтобы добиться этого в предыдущем стандарте, приходилось конструктор копирования и оператор присваивания помещать в приватную часть, закрывая тем самым от пользователя. Закрытые части классов не документируются для конечного пользователя. 3. Пункт 2 - это хак, поскольку невозможно запретить использования этих методов внутри самого класса. Разве что можно было поместить в приватную часть объявления, не снабжая их определениями. Но см выше - это хак. 4. В новом стандарте появился более семантичный способ удаления методов - и он уже включается в документацию, поскольку является такой же полноценной спецификацией интерфейса как для пользователей, так и для разработчиков библиотеки.
2
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 26.09.2014, 13:49 [ТС] | ||
|
Я сейчас пишу программу, у меня там куча всяких временных переменных, функций, есть отдельный экзешник для тестирования. Но по окончании работ я удалю из исходников все отладочные надписи, все временные переменные и вспомогательные функции, чтобы не спотыкаться об них, они черновик. Всё, что не работает- всё удалю. Если всё это оставлять, даже в закомменченном виде, как потом работать с исходниками? Ужас! А тут нам говорят- оказывается, в процессе работы над классом ofstream был у нас такой конструктор, но потом мы его удалили. Мне, как пользователю класса зачем знать, что когда-то у разработчиков был какой-то инструмент (конструктор), которым я в потенциале мог бы пользоваться, но которым я пользоваться не буду потому, что его забраковали? Незачем. Поэтому тут что-то не то.
0
|
||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||
| 26.09.2014, 14:15 | ||
|
Некоторые функции, в частности копирующий конструктор создаются для класса по умолчанию, даже если они не объявлены явно. Версия по умолчанию просто осуществляет почленное копирование полей. Но если такое поведение не соответствует семантике класса, то возможны варианты: либо пишут свой копирующий конструктор (если объект разрешается копировать) или объявляют его как deleted (раньше, до С++11, это делалось помещением объявления копирующего конструктора в private секцию, без определения оного), если копирование не предполагается. Можно бы и в Стандарт заглянуть по теме deleted функций (8.4.3 Deleted definitions)
1
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 26.09.2014, 17:03 | ||
|
Понимаешь ли какая вещь, языки развиваются не только в направлении возможности что-то сделать, но и в направлении улучшить самодокументируемость кода. Знаком с понятием контракт? Например в С++ есть const. Этот const на самом деле не нужен для решения задачи. Мы можем просто помнить какие объекты для нас константы, а какие нет. Правда ведь? Но помнить это утомительно. Тем более, если кто-то другой будет смотреть наш код, то он, естественно, никогда не узнает какие объекты мы задумали const, а какие нет. Гораздо проще переложить это на компилятор, пусть он следит, что константно, а что нет. И другой программист никогда не ошибется, компилятор ему не позволит - напомнит. Иными словами const - это способ описания контракта. Теперь к текущей теме. В соответствии с архитектурой потоков их копировать не имеет смысла. Поток - всегда уникален. Однако в С++ конструктор копирования автоматически генерируется. Мы можем просто написать в документации, что поток копировать нельзя. Но язык позволит это сделать, позволит совершить логическую ошибку - нарушить контракт. И ее обязательно кто-то совершит, т.к. (почти) никто не читает документацию. Это проблема. В С++03 не было языкового средства установить контракт отсутствия копирования (т.е. не было синтаксиса позволяющего указать, что объект класса копировать нельзя, так же как мы можем установить, что объект класса нельзя изменить посредством const). Поэтому для этих целей использовался хак, который описал 0x10 выше (перечитай его пост пожалуйста). В С++11 появилось языковое средство это сделать, без хака. Это средство позволяет пометить функцию класса невозможной к использованию (удалить). Семантически же поведение потоков в С++11 не изменилось, как нельзя их было копировать в С++03, так нельзя их копировать и в С++11, изменилось только средство позволяющее предостеречь пользователя класса от нарушения контракта.
4
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 26.09.2014, 19:23 [ТС] | |
|
Но ведь эти дядьки сами собирают компилятор, почему они делают так, чтобы
1) конструктор копирования всегда вызывался (даже если он вызывается объектом типа ofstream), а потом сами аккуратно так, как им кажется, делают так, чтобы 2) этот конструктор не вызывался, (объявляют его delete). А почему они сразу-то не делают, чтобы он вызывался не во всех случаях? Это же не так, что им дали компилятор собранный, а они бедолаги думают, как бы сделать, чтобы конструктор копирования не вызывался (чтобы поток был один) нет, они его сами и собирают с нуля. Почему ж так-то?
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 26.09.2014, 19:29 | |
|
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 26.09.2014, 19:30 | ||
|
0
|
||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 26.09.2014, 19:31 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 26.09.2014, 19:32 [ТС] | |
|
Я говорю, компилятор всегда добавляет конструктор копирования. Так почему он добавляет конструктор копирования в класс ofstream? Ну кто-то же этот компилятор делал! Почему так сделали-то? Ну ладно при царе горохе, согласен. Но щас-то все всё осмыслили и всё равно его так собирают.
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 26.09.2014, 19:34 | ||
|
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 26.09.2014, 19:45 | |||
|
Добавлено через 3 минуты
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 26.09.2014, 20:02 [ТС] | ||
|
Но компилятор сделан так, что a) КК вызывается всегда б) После чего на него повешена мулька в виде delete о которую все- ах, простите, не все, а такие как я- спотыкаются, и после повешения этой мульки КК перестаёт вызываться. в) И это сделал ОДИН И ТОТ ЖЕ человек, или одна команда разработчиков. ++++++++++++++++++++++++++++++++++++++++ +++++++++++ Если бы я качнул ofstream или как там она называется (std) отдельно он g++, может и вопроса бы такого нет возникло! Действительно, Петя сделал чтобы g++ ВСЕГДА вызывал KK, а Вася, который разрабатывал std сделал так, чтобы этого не было с помощью delete. Всё логично. Мне щас если самому понадобится использовать delete при создании некоторых классов, я и сам буду это делать. Но если бы я кропал компилятор, я бы сразу сделал, чтобы при создании этих классов КК не вызывался. Безо всяких delete. Это же правильно? Правильно. Но так не было сделано для класса ofstream. Не может же это быть простым недосмотром. (Пример: у меня в ту же библиотеку wx ЖЁСТКО зашит макрос UNICODE И никак его не отменить. Вот то есть никак. Вот то есть изначально компилятор сделан ТАК. То есть они как хотят так и делают.)
0
|
||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|||
| 26.09.2014, 20:05 | |||
|
Добавлено через 1 минуту
1
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 26.09.2014, 20:14 | ||||
|
Добавлено через 2 минуты
1
|
||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||
| 26.09.2014, 20:21 [ТС] | |||||||||
|
/////////////////////////////////////////////////////////
Так это всё-таки они доступны (пусть даже ТОЛЬКО с этим опциями)? Проверить не могу, 4.9.1 эти опции игнорирует...
0
|
|||||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|||
| 26.09.2014, 20:23 | |||
|
Добавлено через 35 секунд
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 26.09.2014, 20:27 [ТС] | |||||||
|
ПРошу прощения, зарапортовался я, всё нормально в этой части.
Добавлено через 3 минуты В заголовочном я вряд ли увижу код!
0
|
|||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 26.09.2014, 20:31 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 26.09.2014, 20:41 [ТС] | |
|
Ты хочешь сказать, всё это хозяйство всякий раз перекомпилируется? Я думал всё уже скомпилено, линковщик линкует только и всё.
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 26.09.2014, 20:44 | ||
|
2
|
||
| 26.09.2014, 20:44 | |
|
gcc компилятор
компилятор GCC парит мозг В проекте VS2012 компилятор игнорирует конструкторы классов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
|
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат»
Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
|
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
|