0

このようなことをすることは可能ですか?

template <typename T, typename Comparator = std::less<typename T::Key>>
struct Container
{
    std::map<typename T::Key, T*, Comparator> m;
};

これが問題の部分です。typename Comparator = std::less<typename T::Key>

つまり、コンパレータの特殊化に使用されるTの実装内にtypedefがあります。コンパレータが使用するもの(T :: Key)をテンプレートへの明示的なパラメータとして指定する必要が常にありますか?

Tクラスを変更することでこれを回避する方法は他にもあると思います(たとえば、明示的なT :: compareKeyメソッドが必要です)が、問題は、テンプレート構文を使用してこのようなことを実現できるかどうかです。

4

1 に答える 1

2

テンプレートがインスタンス化されるときに必要なすべての定義が利用可能である限り、それは有効であると確信しており、それは確かに私にとってはうまくいきます。

含めてい<map>ますか?<functional>forも含める必要がある可能性がありますがstd::less、 by に含める必要があると確信してい<map>ます。

お使いのコンパイラは C++11 をサポートしていますか? また、そのサポートを有効にしていますか? 古いコンパイラ (または C++03 に厳密に準拠するように構成されたもの) は、 を使用し>>て 2 つのテンプレート パラメータ リストを閉じると混乱します。彼らはそれを右シフト演算子として解釈します。その場合は、それらの間にスペースを追加することで問題を解決できます。

どちらも問題でない場合は、問題を示す最小限の完全な例と、それが参照しているコード行を示す正確なエラー メッセージを含め、使用しているコンパイラをお知らせください。

于 2012-04-17T12:17:55.087 に答える