У меня есть шаблон класса, который должен иметь возможность сравнить между двумя объектами, с помощью объектов сравнения, полученных из Compare
класса у меня есть:Условно применять типы шаблонов в C++
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; }
};
Однако, когда я пытаюсь скомпилировать это с помощью пользовательского класса, который не имеютперегрузки (даже если указать объект, полученный из Compare
):
MyObjCmp moc;
Container<MyObj>(&moc);
Компилятор жалуется, что оператор не существует:
error: no match for 'operator==' (operand types are 'const MyObj' and 'const MyObj')
Это имеет смысл, потому что Default
класс по-прежнему должен быть создан, хотя я не нуждаюсь в этом. Но теперь мне нужно обходное решение ...
Любые идеи?
'Сравнить * compare_object;' Это вызывает утечку памяти. используйте 'std :: unique_ptr' или' std :: shared_ptr', вместо того, чтобы напрямую использовать 'new' /' delete' –
ikh
Мой деструктор позаботится об этом ... У меня есть флаг boolean default_created и условное удаление, don 't worry :) – Dori
@Niall, я отредактирую его ... Я думал, что это неважно – Dori