2011-11-27 3 views
0

얼마 전에 스택에 대신 힙에 객체가 선언되었을 때 나는 이것을 맹세했습니다. 나는 기본 클래스 (세부 :: 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 '사이에 차이가 있나요"]. C++의 FAQ 및 [동일] (http://yosefk.com/c++fqa/ctors.html#fqa-10.2)의 C++의 FAQ (/ com/C++ - faq-lite/ctors.html # faq-10.2) FQA. – outis

답변

6
detail::SkipFn foo(); 

foo은 (는) 개체가 아닙니다. 반환 유형이 detail::SkipFn 인 함수입니다. //www.parashift : (HTTP - 그래서, 대신 시도

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

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

+1

Google은 "가장 애를 먹는다"라는 뜻입니다. – TonyK

+0

Thanks @TonyK. 수정 됨. – Mahesh

+1

+1. 나는 결코 그 모호성을 고려하지 않았다. 매우 흥미 롭다. 너는 매일 무언가를 배운다. –

관련 문제