2011-11-27 470 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。我從來沒有考慮過這種含糊不清,非常有趣。你每天都會學到東西:) –

相關問題