2012-04-17 8 views
0

パラメータ使用すると、このような何かをすることが可能です:テンプレートを不履行のためのT ::型のtypedefは

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>

すなわちの実装内のtypedefを持っていますコンパレータの特殊化に使用されます。コンパレータが使用するもの(T :: Key)がテンプレートの明示的なパラメータとして指定されることは常に必要ですか?

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

+1

まずコンパイルしてみませんか? – Nawaz

+0

エラーC2146:シンタックスエラー:識別子 'Key'の前に '、'がありません – idij

+3

@idij - どのコンパイラを使用し、どのヘッダを含んでいますか? :-)孤立しているようです。 –

答えて

2

私がいる限り、テンプレートをインスタンス化するときに必要なすべての定義が用意されていて、それが有効だと確信していますし、それは確かにworks for me.

あなたは<map>含めていますか? <map>に含める必要がありますが、std::lessには<functional>を含める必要があります。

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

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

+0

よろしくお願いいたします。有効であることを確認していただきありがとうございます。私は問題を理解しましたが、本当の実装ではすべて一緒に結びつけていたマクロにありました。 Key typedefの定義の前に、マクロにはfriendクラスのContainer行がありました。 – idij

関連する問題