2017-01-07 1 views
2

J'ai lu cette question How to make a function return a pointer to a function? (C++)Comment la fonction peut renvoyer le pointeur sur la fonction qui prend une fonction?

... mais j'ai toujours un problème. La fonction Index renvoie une fonction d'énumérateur qui prend une fonction à laquelle elle renvoie chaque index. Les signatures de fonction ont été typedef ed dans Indexer.hpp:

typedef bool (*yield)(Core::Index*); 
typedef int (*enumerator)(yield); 

... et la classe Indexer

// Indexer.hpp 
class Indexer { 

    public: 
     enumerator Index(FileMap*); 

    private: 
     int enumerate_indexes(yield); 
}; 

// Indexer.cpp 

enumerator Indexer::Index(FileMap* fMap) { 
    m_fmap = fMap; 
    // ... 

    return enumerate_indexes; 
} 

int Indexer::enumerate_indexes(yield yield_to) { 
    bool _continue = true; 

    while(_continue) { 
     Index idx = get_next_index();   
     _continue = yield_to(&idx); 
    } 

    return 0; 
} 

Le compilateur échoue avec l'erreur ci-dessous:

Indexer.cpp: In member function 'int (* Indexer::Index(FileMap*))(yield)': 
Indexer.cpp:60:12: error: cannot convert 'Indexer::enumerate_indexes' from 
type 'int (Indexer::)(yield) {aka int (Indexer::)(bool (*)(Core::Index*))}' to 
type 'enumerator {aka int (*)(bool (*)(Core::Index*))}' 

Qu'est-ce que Je manque dans mes déclarations?

+1

Je dois demander ... Pourquoi faites-vous la vie si difficile pour vous ici? Qu'y a-t-il avec tous les pointeurs de fonction? –

+2

Un pointeur vers une fonction non membre n'est pas identique à un pointeur sur une fonction membre. La différence étant qu'un pointeur sur une fonction non membre n'a pas besoin d'un objet à appeler, mais un pointeur sur une fonction membre le fait. Je vous suggère de lire sur ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) et [' std :: bind'] (http: // en. cppreference.com/w/cpp/utility/functional/bind). –

+0

Aussi, vous devriez savoir maintenant que nous attendons un [MCVE] ici. Vous avez une tonne de types non mentionnés dans cet extrait. –

Répondre

0

En Indexer.hpp le typedef doit indiquer au compilateur que enumerator est une méthode membre Indexer:

typedef int (Indexer::*enumerator)(yield); 

Maintenant, d'autres classes appelant le Indexer::Index(..) est:

enumerator indexer = p_indexer->Index(&fmap); 
indexer(do_something_with_index); 

bool do_something_with_index(Index* idx) { 
    return condition = true; // some conditional logic 
}