2017-01-07 71 views
2

我讀過這個問題How to make a function return a pointer to a function? (C++)函數如何返回指向函數的函數?

...但我仍然有問題。 Index函數返回一個枚舉器函數,該函數接受一個函數,將其生成每個索引。該函數簽名已經typedef版在Indexer.hpp:

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

...和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; 
} 

編譯器失敗,錯誤如下:

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*))}' 

上午什麼我在聲明中錯過了什麼?

+1

我有問...爲什麼你在這裏讓生活如此困難?什麼是所有的函數指針? –

+2

指向非成員函數的指針與指向成員函數的指針不同。區別在於指向非成員函數的指針不需要調用對象,但指向成員函數的指針可以。我建議你閱讀['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)和['std :: bind'](http:// en。 cppreference.com/w/cpp/utility/functional/bind)。 –

+0

另外你現在應該知道我們期望在這裏有一個[MCVE]。這段代碼中有大量未提及的類型。 –

回答

0

Indexer.hpptypedef需要告訴編譯器enumeratorIndexer成員方法:

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

現在,其他類調用Indexer::Index(..)是:

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

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