前段时间,我可以发誓,当我的对象被声明在堆上而不是堆栈上时。我有一个函数,它需要一个指向基类的指针(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