+
Может, это и не много, но все - по делу.
А вот - что больше всего порадовало.
Берешь icpp, там есть шаблончик
class CSimpleCollection : public CSimpleContext, public COLLTYPE
меняешь порядок наследования:
class CSimpleCollection : public COLLTYPE, public CSimpleContext
И получаешь моментальный вылет в космос при использовании методов коллекции.
На эту тему есть запись:
http://www.1cpp.ru/bugs/show_bug.cgi?id=3840Как ты думаешь, я много времени потратил на поиск решения?
10 минут.
Потому что знал, где искать.
Теперь представь, что ты берешь этот код и пытаешься разобраться.
Хватит 10 минут?
Мне в чужом коде - точно нет.
Беда в том, что Intel не диагностирует данный тип проблемы.
Intel допускает ОЧЕНЬ вольное обращение с указателями на функции-члены.
А указатель на функцию-член - это очень хитрый тип данных, которому такое обращение совсем не подобает.
К примеру, в оригинале указатель из типа CSimpleCollection::* преобразуется в CBLContext::* вообще полностью неявно:
pDef->AddFunc("Count", "Количество", 0, funcCount);
И ничего - ни малейшего сомнения у ICL.
VS9 требует же явного приведения типа (да-да, я знаю, что делаю)
pDef->AddFunc("Count", "Количество", 0, static_cast<CSimpleDef::PF_Func>(&CSimpleCollection::funcCount));
И при изменении порядка базовых классов дает максимально точное определение этого безобразия:
warning C4407: cast between different pointer to member representations, compiler may generate incorrect code
100% верно.
При том, что и VS9, и ICL делают одно и то же, "they generate incorrect code"
Только ICL это делает молча.