получение производного класса по базовому указателю?

Могу поклясться, что это работало некоторое время назад, когда мой объект был объявлен на куче, а не на стеке. У меня есть функция, которая принимает указатель на базовый класс ( 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 временным). Почему так?

0
задан Kerrek SB 27 November 2011 в 11:53
поделиться