2017-09-29 83 views
0

gcc 6.4.0 win 7 Netbeans 8.2如何創建和指向函數的指針數組?

我無法弄清楚我做錯了什麼。重複

#ifndef TYPEDEF_H 
#define TYPEDEF_H 

class Typedef { 
    class Alphabet { }; 
    class Tuple { }; 
    class Operations { }; 
public: 
    void test(); 
private: 
    Tuple constant(long one, long two, Alphabet& bet, Operations& op) { return Tuple(); } ; 
    Tuple expression(long one, long two, Alphabet& bet, Operations& op) {return Tuple(); } ; 
}; 

#endif /* TYPEDEF_H */ 

===================== .cpp file ======================== 
#include "Typedef.h" 

void Typedef::test() { 
    typedef Tuple (*fn)(long, long, Alphabet&, Operations&); 
    fn func[]  = { constant, expression }; 
    Tuple (*fnc[2])= { constant, expression }; 
} 

Typedef.cpp: In member function 'void Typedef::test()':

Typedef.cpp:6:44: error: cannot convert 'Typedef::constant' from type 'Typedef::Tuple (Typedef::)(long int, long int, Typedef::Alphabet&, Typedef::Operations&)' to type 'fn {aka Typedef::Tuple (*)(long int, long int, Typedef::Alphabet&, Typedef::Operations&)}' fn func[] = { constant, expression };

該錯誤消息的所有四個實例。我試過&不變,並預期它沒有工作。

+0

成員函數不是函數... –

+0

您可能感興趣的['標準:: function'(http://en.cppreference.com/w/cpp/utility/functional/function)。 –

回答

2

類成員函數是在它接受一個額外的不可見的參數,this*指針特殊。此外,成員函數和一個免費的功能是完全不同的類型,即使後者曾與this*類型兼容的額外的參數。

要捕獲的指針成員函數,使用成員指針語法(Typedef::*),如下所示:

void Typedef::test() { 
    typedef Tuple (Typedef::*fn)(long, long, Alphabet&, Operations&); 
    fn func[] = { &Typedef::constant, &Typedef::expression }; 
} 

此外,成員函數的地址可以採取僅在完全限定名稱(參考:[expr.unary.op]/4),所以你必須使用&Typedef::constant, &Typedef::expression

+0

謝謝。我不明白爲什麼Typdef ::是必需的,因爲函數是可見的。 –

+2

@ArthurSchwarez查看我的更新。這裏的Typedef :: *不是用於可見性,而是成員指針語法。 – rustyx