我可以在前一段时间宣誓这个工作,当时我的对象是在堆上而不是在堆栈上声明的。我有一个函数,它接受一个指向基类的指针(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成为临时)它不会。那是为什么?
答案 0 :(得分:6)
detail::SkipFn foo();
foo
不是对象。它是一个返回类型为detail::SkipFn
的函数。所以,请尝试 -
detail::SkipFn foo; // Notice the removal of (). Google most vexing parse
// for explanation.