【发布时间】:2014-11-28 12:22:12
【问题描述】:
我有一个类模板,它需要能够通过比较从我拥有的Compare 类派生的对象来比较两个对象:
template<typename T>
class Container {
public:
template<typename A, typename B>
class Compare {
public:
virtual bool eq(const A&, const B&) const = 0;
};
我提供了一个默认的比较对象,假设类型T 有运算符==:
template<typename A, typename B>
class Default : public Compare<A,B> {
public:
bool eq(const A& a, const B& b) const { return a==b; }
};
private:
Compare<T,T>* comparison_object;
bool uses_default;
Container() : comparison_object(new Default<T,T>()), uses_default(true) {}
Container(Compare<T,T>& cmp) : comparison_object(&cmp), uses_default(false) {}
~Container() { if(uses_default) delete comparison_object; }
};
但是,当我尝试使用 不 具有 operator== 重载的自定义类(即使我提供从 Compare 派生的对象)的自定义类来编译它时:
MyObjCmp moc;
Container<MyObj>(&moc);
编译器报错操作符不存在:
error: no match for 'operator==' (operand types are 'const MyObj' and 'const MyObj')
这是有道理的,因为 Default 类仍然需要创建,即使我不需要它。但现在我需要一个解决方法...
有什么想法吗?
【问题讨论】:
-
Compare<T,T>* comparison_object;导致内存泄漏。请使用std::unique_ptr或std::shared_ptr,而不是直接使用new/delete -
我的析构函数会处理它...我有一个“default_created”布尔标志和条件删除,别担心 :)
-
@Niall,我会编辑它...我认为没关系
-
@remyabel:它被标记为 C++,现在这意味着 C++11(或者可能是 14,我不确定这是否是正式的标准)。
-
@remyabel:我想是的,尽管最好的答案会在他们使用新功能时提及,并为那些过去的人建议解决方法。不过,这只是我的看法。