Следующий отрывок ранее компилировался под Borland C++, MSVC и OpenWatcom:
class aaa {
virtual _fastcall ~aaa();
};
class bbb:public aaa {
};
Он не компилируется под gcc/g++ (MinGW 4.8.0). Ошибка:
probz.cpp:7:7: error: conflicting type attributes specified for 'virtual bbb::~bbb()' class bbb:public aaa { ^ probz.cpp:3:20: error: overriding 'virtual aaa::~aaa()' virtual _fastcall ~aaa()=0;///can't be abstract ^
Очевидно, что bbb::~bbb() не существует!
РЕДАКТИРОВАТЬ
Фактическая иерархия классов больше, есть много классов bbb, наследуемых от aaa, и между ними есть промежуточные члены, например, bbb расширяет abb, который расширяет aab, который расширяет aaa. . aaa действительно имеет абстрактный виртуальный деструктор, который получает реализацию в промежуточных классах, но не в листьях. Да, я могу удалить атрибут __fastcall
, и он скомпилируется. Это ограничение gcc, что я не могу настроить соглашение о вызовах?
inline aaa::~aaa() {}
под определениемclass aaa
. - person Praetorian   schedule 07.02.2015bbb::~bbb()
? Хотя при подкладке должно быть найдено определение для чисто-виртуальной базы-дтор. - person Deduplicator   schedule 07.02.2015_fastcall
, возможно, gcc (MinGW) не знает, что это значит. Я снова открою вопрос, но, пожалуйста, избавьтесь от чистого виртуального деструктора или добавьте для него определение. - person Praetorian   schedule 07.02.2015__fastcall
для деструктора базового класса и жалуется на то, что он не указан в производном классе. В этом есть смысл — вам нужно согласованное соглашение о вызовах для всех реализаций одной и той же виртуальной функции, иначе вы не сможете отправлять их полиморфно. Возможно, эти другие компиляторы были готовы позволить это подразумевать, но GCC нет - такие спецификаторы находятся за пределами стандарта языка C++, поэтому компиляторы могут свободно принимать все, что они считают разумным. - person Tony Delroy   schedule 07.02.2015