2017-04-13 74 views
0
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 ? 
    } 
    } 
}; 

此代码不能编译为G ++不能访问Nested,因为我没有访问嵌套之前解决Daugher的模板。如果我写Daughter<?????>::Nested,我想可能会有效。但是,我需要给Daughter自己的比较器,我无法访问,因为这需要我通过Daughter<?????>和递归访问它。解决模板与嵌套类

我非常确定,我正在尝试做的事情在C++中是无效的,因为在访问它的嵌套类之前我应该​​解决Daughter。然而,我的Nested类非常简单,并且不需要上层的类来真正定义。

所以,我可以宣布NestedDaughter,称这是FooComparator或东西,但它似乎吸尘器说,这是NestedDaughter

请注意,我不希望在Foo范围内申报operator<,因为在我的真实情况下,它代表的是城市,我认为对城市申报operator<并不是很干净。

是否有一个更清洁的选项,以便我可以声明我的女儿类并要求它使用它自己的比较器?

回答

1

其实对我来说,一个好的解决方案就是像你说的那样实现FooComparator,因为如果比较器属于Foo,所以它在Daughter之内没有意义。如果您需要再次比较Foo而来自另一个班级,该怎么办?但是,也许你能有你的比较中富实现的,如果你绝对要在类中该比较器类:使用嵌套=美孚::比较

struct Foo { 
    struct Comp: Comparator<Foo> { 
    ... 
    }; 
}; 

class Daughter: public Mother<Foo, Foo, Foo::Comp> 
{ 
    ... 
}; 
+1

和可能,',''里面Daughter'。 – Jarod42