さて、可変個引数テンプレートを使用して n 次元で範囲ツリーを実装しようとしています。基本的なセットアップは機能していますが、オプションで比較関数オブジェクトをテンプレート リストに渡して、std::less 以外でツリーをソートできるようにしたいと考えています。
私が最初に考えたのは、型と比較関数を含むペアを最初の要素として含むバージョンで、テンプレート リストをオーバーロードできるということです。しかし、テンプレート宣言行をコンパイルすることがわかりません。Visual C++ (2015) は C2079: "std::pair::first uses undefined class 'T'" で始まります。
とにかく、コードに進みます。ここに私がやろうとしていることを示す小さなスニペットがあります:
template <class... Args> class rangetree{
};
template <class T, class... Args> class rangetree<T, Args...> {
public:
map <T, rangetree<Args...> * > tree;
};
これはすべて正常に機能します。しかし、別のバージョンの rangetree を最初のテンプレート メンバーとして追加すると、次のような問題が発生します。
template <pair<class T, class Compare>, class... Args> class rangetree<pair<T, Compare>, Args...>{
public:
map <T, rangetree <Args...> *, Compare> tree;
};
これは、コンパイラが満足する方法でフォーマットされているように見える部分です。less 以外のものを使用する必要がある場合は、必要に応じてテンプレート メンバーと比較関数を組み合わせるという考え方です。