2015-12-16 62 views
8

考慮,其存儲包含在其內部兩個鍵和值的類型的這種特殊的容器類,所以模板與方法指針參數的默認值

template<typename K, typename T, K (T::*method)() const> 
class Container 
{ 
//... 
}; 

K是密鑰的類型,T是一種類型的值並且方法指針用於從值中檢索密鑰。

它工作正常,但我想以包括方法指針默認,這樣,當調用者沒有指定,它會operator K() const像這樣:

template<typename K, typename T, K (T::*method)() const = &T::operator K const> 

但這並不能編譯,說明有當我嘗試實例化它時(並且有這樣一種方法),它是no member operator const K on A (<- my class I test this with)。是否有可能具有方法指針模板參數的默認值?如果是,那麼正確的語法是什麼?

編輯:除了下面的解決方案有一個「固定」的情況下,當T是一種使用新的C++ 11特徵std::remove_pointer<T>::type一個指針,所以:

template<typename K, typename T, K (std::remove_pointer<T>::type::*method)() const = &std::remove_pointer<T>::type::operator K> 
+1

這個想法是[聲音原則](http://ideone.com/fgtF5y)。它可能只是正確拼寫特定函數名稱(轉換函數)的問題。 –

+2

[There](http://ideone.com/k1bCEJ),也許刪除'const'? –

+1

'operator K const'(=='operator const K')將是一個轉換函數,以及'const K'。 –

回答

5

的函數的名稱只是operator K。其資格不是名稱的一部分。試試:

template <typename K, 
      typename T, 
      K (T::*method)() const = &T::operator K> 
//         ^^^^^^^^^^^^^^ 
+2

好點:成員的名稱不*包含限定詞(或參數)。如果有必要解決一個過載問題,那需要通過轉換成一個合適的成員指針來完成(在這種情況下,這個指針很容易獲得)。 –

+0

對,當然。現在它工作,除了當我使用指針T作爲參數。我想專業化應該可以幫助解決這個問題。 – Resurrection

+0

我想出了當T是指針時的情況。作爲編輯添加到OP。 – Resurrection