1 Речі які я писатиму нижче дуже легко взнати відкривши книжку з C++ чи її стандарт. все це дуже докладно описано
наприклад в
*C++ Professional Programmer's Handbook ANSI-ISO
*C++_By_Dissection
*ANSI ISO 14882 (C++ standart)
бінарний пошук у змісті - пара хвилин на читання - і не треба мучитись ночами, звинувачуюючи компілятор у відсутніх у ньому помилках та ваяти невідомо які милиці
2.
inst_flags |= INSTALL_INSTALL;
inst_flags |= INSTALL_HASH;
але саме в останніх двох стрічках компілятор викидає помилку що не може перевести int в rpmInstallInterfaceFlags
Очевидно ви пишете на C++. В ньому не припускається неявне приведення int до enum, лише enum до int.
А в С-ішному rpm це працює.
3.
примусове переведення (rpmInstallInterfaceFlags) теж нічого не дало
Примусове приведення
inst_flags = rpmInstallInterfaceFlags(inst_flags | INSTALL_INSTALL | INSTALL_HASH);
в мене і за стандартом працює!
4.
ви ймовірно неправильно приводили - ось так?
inst_flags |= (rpmInstallInterfaceFlags) INSTALL_INSTALL;
це не буде працювати, тому що оператор '|' визначений для int, а не для enum
таким чином відбудеться явне приведення int INSTALL_INSTALL до rpmInstallInterfaceFlags
після чого для виконання оператора
inst_flags | (rpmInstallInterfaceFlags) INSTALL_INSTALL
обидва операнди будуть неявно приведені до int. Результат типу int не може бути неявно приведений до типу лівої частини оператора присвоювання (див 2)
5.
Ви чим компілите, gcc чи g++
цілком очевидно, що markus компілює в режимі C++, а як gcc вибрав цю мову - через опцію командного рядка, розширення файлу, чи запуску g++ - не має значення
6.
Такий от трюк неможливий без RTTI
Такий 'трюк' цілком можливий у C і цілком неможливий у C++, незалежно від RTTI. RTTI тут взагалі ні до чого - дивіться далі
7.
а воно, наскільки я пам'ятаю, у gcc вимкнено.
мовний режим C чи C++ виставляється не запуском gcc а комбінацією факторів - див 5
RTTI - це спосіб взнати динамічний тип змінної і має стосунок лише до класів. ніякого стосунку ні до C, ні до перетворення між int та enum воно не має. Зрозуміло, що в C нема класів, і тому немає і RTTI
Проблему вирішив кустарним способом.
А може у мене компілятор якийсь не правильний
А проблеми то не було, компілятор у вас правильний і ніяких кустарних способів вигадувати не треба було - дивіться 3
Якщо чесно мені такий підхід видається диким і абсурдним.
Якщо ви маєте на увазі розробку без ознайомлення з інструментом та доробками інших, і як результат - втрата часу і написання нікому непотрібних та малозрозумілих сторонній людині милиць - то я згоден
Якщо ви маєте на увазі сильне типування enum - то його дотримуються в C++, Pascal всіх різновидів, C#
Найшов вирішення проблеми Усмішка по вуха. Не знаю чим я думав раніше. Прблема була не в компіляторі. Просто потрібно було перевантажити оператор |= для типів rpmtransFlags і rpmInstallInterfaceFlags і програма компілюється без усяких проблем
Нічого ви не знайшли - адже причину помилки ви не довідались і знову недолугі костурі наваяли експериментальним шляхом. Дивіться 3.
Чесно кажучи, я правильного компілятора зроду не бачив. Знаєте, які перли gcc часом видає, особливо gcc3? Тільки четвертий потрохи до стандартів приводять.
розкажіть, де вам ще компілятор заважає