2016-05-27 12 views
1

ich mit diesem Stück Code bin zu kämpfen:Mit Zeiger auf Member-Funktionen mit std :: shared_ptr

typedef shared_ptr<node <T>> (node<T>::*son_getter)(); 
    son_getter get_son[] = {&node<T>::getLeftSon, &node<T>::getRightSon}; 

insert = node->*get_son[index](); 

ich einen Kompilierungsfehler:

error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘get_son[index] (...)’, e.g. ‘(... ->* get_son[index]) (...)’ 
insert = node->*get_son[index](); 

Wo node ist shared_ptr<node<T>> nur wie insert ist.

Ich habe alles versucht was ich erraten konnte und immer noch keine Ahnung was los ist.

+0

Voll Code, bitte. – SergeyA

+0

@SergeyA Sei vorsichtig, was du dir wünschst. :) –

+0

Mit Klammern bekomme ich "keine Übereinstimmung für Operator -> *". Muss ich wirklich überladen? –

Antwort

1

Zunächst hat ein Funktionsaufrufoperator () eine höhere Priorität als ->*. Daher müssen Sie Klammern hinzufügen, um die gewünschte Bewertungsreihenfolge zu erzwingen. Darüber hinaus ist node ein intelligenter Zeiger, während der Zeiger auf Elementfunktion auf den Typen verweist, der in dem freigegebenen Zeiger gespeichert wird.

auch sagen, dass Sie eine der folgenden Alternativen verwenden müssen:

(*node.*get_son[index])(); 

(&*node->*get_son[index])(); // or std::addressof(*node)->* 

(node.get()->*get_son[index])();