вот захотел скомпилить свои старые проги, написанные на VC, на GCC. понятное дело, столкнулся с проблемами: 1. с шаблонными классами всё довольно муторно. вызов родиеля в шаблонном классе: Код (Text): template <typename t> class CChildT : public CBaseT<t> { CChildT(int x) : CBaseT(x) {} // vc компилит, gcc требует так: CChildT(int x) : CBaseT<t>(x) {} } или обращение к переменной родителя: Код (Text): CBase<t>::m_x = 3; вместо Код (Text): m_x = 3; 2. нет ключевого слова __super - довольно неудобно. я всё это к чему - хотелось бы писать универсальный код - не привязываться к конкретному компилятору.
gcc 3.4.5 vc 2008 может можно gcc как-то научить понимать хотябы __super. я уже не говорю о __intn и прочих приблудах.
Ну тройка тоже кхе кхе. У студии много расширений, но что мешает более строго придёрживаться стандарта?
иногда это удобно, а иногда эти очевидные компилеру предположения приводят к весьма загадочным при отлове ошибкам
вот ещё столкнулся с проблемой компиляции x64 прог под винду. под линь есть куча версий - и для x32 и для x64. под вынь же бинарники x64 найти не могу вообще (
Нелогично. А если так? Код (Text): template <class T> class Z : public B<T>, public B<int> { public: Z(int i) : B<T>(i), B<int>(i) {} }; Ну, это стандарт - шаблоны не наследуют имена, поскольку не факт, что они есть в базовом классе. В таких случаях надо подсказывать компилятору. Вообще, имхо ужос из бездны... ты еще о __property пожалей
Ustus прошу прощения, если я чем-то обидел пользователей gcc. просто в VC есть вещи, к которым я привык и как-то неуютно обходиться без них. Во-первых, я не объявлял множественное наследование, следовательно, компилятор может сообразить и просмотреть мемберы родителя. Во-вторых, при множественном наследовании, если есть одинаковые функции, то наследуются в первую очередь от того класса, который в списке идёт первым. для полей можно было-бы сделать также. так что, не вижу здесь большой проблемы. но каждый раз в дочернем классе писать CBase<t>::m_a = CBase<t>::m_b - CBase<t>::m_c - как-то коряво. ну, извините, привычка. а вообще удобно. да и что в нём такого? безобидная директива. зато код, типа: Код (Text): void CChild::func(int a) { return __super::func(a); } сразу понятен, а вот код Код (Text): void CChild::func(int a) { return CBase::func(a); } тут ещё нужно сообразить - наследуется ли CChild от CBase или там идёт вызов статического метода...
Это чревато багами, намного правильнее явно ввести в простанство имён производного класса именованные члены базового, с помощью using объявления. Код (Text): class Derived : public Base1, public Base2 { public: using Base2::foo; };
Код (Text): Бинарники кого??? бинарники компилятора gcc, умеющего собирать код под win х64. с сорцами возиться я не имею особого желания.
cupuyc Пользователей gcc не так-то легко обидеть они закаленный народ особенно типа меня, которых судьба до сих пор вынуждает юзать 3-ю версию Это не так, как уже указал Booster. Коряво, в первую очередь потому, что юзать поля суперкласса из субкласса - моветон ибо нарушение инкапсуляции. В нем такого, в первую очередь, что оно нестандартное. Для меня этого достаточно, чтобы не пользоваться, даже если удобно. И вообще - фича хороша для одиночного наследования, хотя я бы и там без нее обошелся бы, но при наличии множественного вносит дополнительный бардак. Но если очень хочется - что мешает написать Код (Text): class D : public B { typedef B super; void f(); }; vod D::f() { super::f(); } Другое дело, что я не вижу в этом смысла. А какая разница? Что есть, то и вызывается. Кстати, с __super тоже может быть вызвана статическая функция, что имхо еще менее наглядно.