получить производный класс по базовому указателю? - PullRequest
0 голосов
/ 27 ноября 2011

Я мог бы поклясться, что это сработало некоторое время назад, когда мой объект был объявлен в куче, а не в стеке.У меня есть функция, которая принимает указатель на базовый класс (detail :: DuplicateFn).- Хотя это виртуальный класс, фактические указатели даются производным классом (т.е. dteail :: SkipFn)

1>GMProject.cpp(298): error C2664:
'void xml_tree<V>::combine_if<bool(__cdecl *)(const T &,const T &)>(const xml_tree<V> &,Predicate,const detail::DuplicateFn *)' :
cannot convert parameter 3 from 'detail::SkipFn (__cdecl *)(void)' to 'const detail::DuplicateFn *'

Моя функция:

void GMProject::CombineTree(const pTree& Other) {
    detail::SkipFn foo();
        ProjectTree.combine_if(Other, &SimilarTreeValue<GMProject::pTree>, &foo);
}

Где ProjectTree.combine_if () в качестве третьего параметра требуется указатель на «DuplicateFn» - а SkipFn является производным от DuplicateFn.

Как уже говорилось, это работает (как я и ожидал) правильно, если я объявляю «foo» в куче.Однако это не так, когда объявляется foo в стеке (или, что делает foo временным).Почему это так?

1 Ответ

6 голосов
/ 27 ноября 2011
detail::SkipFn foo();

foo не является объектом.Это функция, тип возврата которой detail::SkipFn.Поэтому вместо этого попробуйте -

detail::SkipFn foo;   // Notice the removal of (). Google most vexing parse 
                      // for explanation.

Есть ли разница между списком x;и список x ();?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...