class Foo // Empty class
{
};
template <class T> // Abstract class
class Comparator
{
public:
virtual ~Comparator() {}
virtual bool operator()(const T& e1, const T& e2) = 0;
};
// Mother class that contains a map and some other methods that I did not copied here
template <class Key, class Value, class Comparator = std::less<Key> >
class Mother
{
private:
std::map<Key, Value, Comparator> data_;
};
// Daughter class that wants to use its own Comparator (called Nested)
class Daughter : public Mother<Foo, Foo, typename Daugher::Nested>
{
public:
class Nested : public Comparator<Foo>
{
bool operator()(const Foo& e1, const Foo& e2)
{
return true; // Not my real code. However, what would it mean to always return true in this kind of operation ? std::map would be pretty unusable, i guess ?
}
}
};
入れ子にアクセスする前にDaugherのテンプレートを解決しなかったので、G ++はNested
にアクセスできないため、このコードはコンパイルされません。私がDaughter<?????>::Nested
と書いたらうまくいくかもしれないと思います。しかし、私はDaughter
に独自のコンパレータを与える必要があります。なぜなら、それは私がDaughter<?????>
で再帰的にアクセスする必要があるためアクセスできませんでした。入れ子になったクラスでテンプレートを解決する
私は、Nestedクラスにアクセスする前にDaughter
を解決する必要があるので、私がやろうとしていることがC++では無効であることを確信しています。しかし、私のNested
クラスはかなりシンプルで、実際にその上位クラスを定義する必要はありません。
だから、私はそれFooComparator
か何かを呼び出す、Daughter
外Nested
を宣言することができますが、それはそれはDaughter
内部Nested
だったと言ってきれいに見えました。
私の本当の場合には、それは都市を表しているので、私はFoo
内部operator<
を宣言したくないことに注意してください、と私は都市のoperator<
を宣言することは非常にきれいであると思わないで下さい。
Daughterクラスを宣言して独自のコンパレータを使用するように指定できるクリーナオプションがありますか?
おそらく、 'Daughter'内で' Using Nested = Foo :: Comp; ' – Jarod42