前段時間,我可以發誓,當我的對象被聲明在堆上而不是堆棧上時。我有一個函數,它需要一個指向基類的指針(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(或-ultimatelly-使foo成爲臨時)。這是爲什麼?
參見[ 「有目錄X'之間的任何差別;和'清單X()','?」(HTTP://www.parashift。 com/C++ - faq-lite/ctors.html#faq-10.2)來自C++ FAQ以及C++的[相同](http://yosefk.com/c++fqa/ctors.html#fqa-10.2)常見問題解答。 – outis