|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
Конструкторы ofstream и стандарт C++11 и компилятор gcc необходимо разобраться26.09.2014, 13:16. Показов 4753. Ответов 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 компилятор игнорирует конструкторы классов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|