TechsMex

技術エンジニア C++/Python/Java

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