2011-11-27 128 views
0

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

参见[ “有目录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

回答

6
detail::SkipFn foo(); 

foo不是一个对象。这是一个返回类型为detail::SkipFn的函数。所以,而是尝试 -

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

Is there any difference between List x; and List x();?

+1

谷歌“最令人头疼的解析”,你的意思是。 – TonyK

+0

谢谢@TonyK。纠正。 – Mahesh

+1

+1。我从来没有考虑过这种含糊不清,非常有趣。你每天都会学到东西:) –

相关问题