2016-06-07 58 views
1

在代碼中解釋它比較容易。函數作爲模板參數用於具有該函數作爲模板參數的類的字段

我有了模板,隨後哈希映射數據結構: -

template<class K,class T,long (* K_hashingFunction)(K&)> class AMap{ 
    //^Key  ^Value  ^Hashing function for Key 
} 

它可以作爲我的預期。

然後,我要聲明的迭代器類如下: -

template<class K,class T,long (* K_hashingFunction)(K&)> class AMap_iterator{ 
    AMap<K,T, ????? >* mapPtr=nullptr; //How should I declare its type? 
} 

問題:什麼是聲明mapPtr作爲一個字段以正確的方式?

AMap<K,T, K_hashingFunction >* mapPtr=nullptr; //? 
AMap<K,T, &K_hashingFunction >* mapPtr=nullptr; //? 
AMap<K,T, *K_hashingFunction> * mapPtr=nullptr; //? 

所有論文給我一個智能感知錯誤:「不能代替模板參數」

+3

智能感知錯誤沒有錯誤(只有可能的錯誤提示)。 'AMap * mapPtr = nullptr;'是正確的。 –

+0

是的,我接受C++ 11及更高版本。謝謝! DieterLücking。 – javaLover

+1

爲什麼不簡單使用'AMap *'? – AndyG

回答

2

這是正確的:

AMap<K,T, K_hashingFunction >* mapPtr=nullptr; 

我們只是複製所有模板參數 - 無需修改。請注意,解除引用函數指針也應該起作用,因爲函數只會衰減回指針。

由於注入的類名,雖然,我們可以簡化爲:

AMap* mapPtr = nullptr; 
+0

但是這種類型在'AMap_iterator'內部使用,所以注入的類名方法不起作用。 – TartanLlama

1

只需添加到巴里的答案。

AMap<K,T, &K_hashingFunction >* mapPtr=nullptr; 

不正確,因爲表達&K_hashingFunction將返回指針函數指針。不是指向函數的指針。

相關問題