Template parameter redefines default argument
上記のエラーはデフォルト引数を伴うテンプレートクラスの前方宣言で陥りがちな問題。
// 前方宣言
template <typename T = int> struct Number;
// 実装
template <typename T = int> struct Number { T value; };
/// error: Template parameter redefines default argument
前方宣言時のデフォルト引数を未指定にすることで対処可能。
// Good!!
template <typename T> struct Number;
template <typename T = int> struct Number { T value; };
または実装側のデフォルト引数を未指定にしてもよい。
// Good!!
template <typename T = int> struct Number;
template <typename T> struct Number { T value; };