using template type parameter ‘T’ after ‘class’ エラーについて
発端
C++テンプレートの勉強をしていた時の備忘録
試しに二次元連想配列(キーを二つ持つ配列)をテンプレートクラスを
使ったところ、コンパイルエラーが発生した
以下コンパイルエラーの一部
double_map.h:18:21: error: using template type parameter ‘T’ after ‘class’ 18 | int DoubleMap<class T, class K>::GetValue(T row, K col)
原因
メンバ関数の定義の際に、'class' をつけてしまっていた。
こんなミスだったなんて・・・
template <class T, class K> int DoubleMap<class T, class K>::GetValue(T row, K col) { return map_.at(row).at(col); }
上記のint DoubleMap< class T, class K>部分
定義の際にはint DoubleMap< T, k>で良い。
template <class T, class K> int DoubleMap<T, K>::GetValue(T row, K col) { return map_.at(row).at(col); }
結論
エラーはよく読もう
ソースコード
#ifndef DOUBLE_MAP_H_ #define DOUBLE_MAP_H_ #include <unordered_map> template <class T, class K> class DoubleMap { public: int GetValue(T row, K col); void SetValue(T row, K col, int val); private: std::unordered_map<T, std::unordered_map<K, int>> map_; }; template <class T, class K> int DoubleMap<class T, class K>::GetValue(T row, K col) { return map_.at(row).at(col); } template <class T, class K> void DoubleMap<class T, class K>::SetValue(T row, K col, int val) { map_.insert({row, {}}); map_[row].insert({col, val}); } #endif
正しくはこちら
#ifndef DOUBLE_MAP_H_ #define DOUBLE_MAP_H_ #include <unordered_map> template <class T, class K> class DoubleMap { public: int GetValue(T row, K col); void SetValue(T row, K col, int val); private: std::unordered_map<T, std::unordered_map<K, int>> map_; }; template <class T, class K> int DoubleMap<T, K>::GetValue(T row, K col) { return map_.at(row).at(col); } template <class T, class K> void DoubleMap<T, K>::SetValue(T row, K col, int val) { map_.insert({row, {}}); map_[row].insert({col, val}); } #endif