2012-02-29 80 views
0

我有一個我稱之爲hash的模板類。我的模板類hash需要三個非類型參數。在hash類的定義如下:將函數指針傳遞給模板類

template <typename array_type, typename ptr_to_hash, typename hash_type> 
class hash 
{ 
    public: 
    //default constructor 
    hash(); 

    /* Overloaded Constructors */ 

    // instantiates a hash object and the pointer to the hash_function 

    hash(const int&, std::ifstream&, const char*, ptr_to_hash*); 


    /* Methods for Hash Class */ 
    void insert_to_hash(); 

    // some other stuff  
}; 

正如你可以看到我想我非類型參數ptr_to_hash是一個指向我的功能void insert_to_hash。上面的重載構造函數的實現如下所示:

template <typename array_type, typename ptr_to_hash, typename hash_type> 
hash<array_type, ptr_to_hash, hash_type>::hash(const int& dim, std::ifstream& in, const char* file, ptr_to_hash* hash_ptr) 
{ 
    // do some stuff to allocate from file 

    // point function pointer to correct function 
    hash_ptr = &this->insert_to_hash(); 
} 

現在主要我試圖創建一個指向我的哈希函數的指針。所以我首先創建一個void函數指針,然後傳遞給我的重載的構造函數:

int main() 
{ 
    // create void function pointer 
    void (*foo)(); 

    //create hash obj. from data read in from argv[1] 
    hash< member<int>, void(*), member<int> > awesome(count_lines(in,file), in, file, foo); 
} 

在上面member<int>是一個模板結構和count_lines()只返回一個整數值的文件中量線。當我試圖做到這一點我得到錯誤

no matching function for call to ‘hash<member<int>, void*, member<int> >::hash(int, std::ifstream&, const char*&, void (*&)()) 

當我看到上述錯誤我似乎是通過我的foo函數指針對象*&這當然不符合我的類中的任何函數調用。

這是我的問題的關鍵。我不確定如何在使用模板時傳遞指向我的hash類中的void insert_to_hash()的函數指針。我顯然做錯了。

+0

爲什麼當你有「類型參數」時說「非類型參數」? – 2012-02-29 06:26:13

+0

@KerrekSB上面我有'array_type',它沒有綁定到特定類型,比如'int'或'double',因此我使用非類型。這是不正確的語法嗎? – 2012-02-29 06:28:01

+0

@Nic'N'在這個例子中是一個非類型參數:'template struct foo {char x [N]; };'。用'typename'(或'class')聲明的模板參數是一個類型參數。 – 2012-02-29 06:33:44

回答

2

作爲參考的foo的類型是void(&)(),並且作爲指針它是void(*)()。我會忽略從模板簽名的明確指針,並讓它成爲爭論的一部分:

template <typename FPtr> void run(FPtr f) { f(); } 

void foo() { /* ... */ } 

// ... 

run<void(*)()>(foo); 

你也可以聲明run(FRef * f) { f(); }run<void(&)()>(foo),但我不會理會。有沒有辦法不是有一個函數指針的指針,所以你不妨將它吸收到參數類型本身。

1

考慮使用lambda而不是函數指針。

hash< member<int>, void(*), member<int> > awesome(count_lines(in,file), in, file, [what ever you want to pass]{}); 

和你的問題無疑是一個簽名不匹配的它明確指出的你已經使用功能的簽名是不是你已經宣佈什麼。

0

您的代碼有幾個問題。 首先,這條線

hash_ptr = &this->insert_to_hash(); 

試圖使用&操作者對RETURN從CALL到insert_hash()和把結果賦給hash_ptr。其次,如果你糾正了這個問題,你仍然試圖從一個對象實例中將一個成員分配給函數指針 - 而你不能。如果您將insert_to_hash方法設爲靜態,您可以這樣做:

template <typename ptr_to_hash> class hash 
{ 
public: 
    hash(ptr_to_hash hash_ptr) 
    { 
     hash_ptr = insert_to_hash; 
    } 

    static void insert_to_hash() 
    { 
    } 
}; 

int main(int argc, char *argv) 
{ 
    void (*foo)(); 

    hash< void(*)() > awesome(foo); 

    return 0; 
} 
+0

實際上,其他情況會發生 - 爲什麼當函數指針的類型被模板類中定義的函數完全修復時,將其作爲模板參數? – 2012-02-29 12:06:12