Mam klasy szablon, który wymaga, aby móc porównać między dwoma obiektami, poprzez obiektów porównawczych pochodzących z klasy Compare
mam:Warunkowo egzekwować rodzaje szablonów w C++
template<typename T>
class Container {
public:
template<typename A, typename B>
class Compare {
public:
virtual bool eq(const A&, const B&) const = 0;
};
ja zapewnić obiekty porównawcze domyślna zakładając typ T
ma operatora ==
:
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; }
};
jednak gdy próbuję skompilować to z klasą niestandardową nie mieć operator==
przeciążenie (nawet jeśli stanowią przedmiot pochodzący z Compare
):
MyObjCmp moc;
Container<MyObj>(&moc);
Kompilator skarży się, że operator nie istnieje:
error: no match for 'operator==' (operand types are 'const MyObj' and 'const MyObj')
Ma to sens, ponieważ klasa Default
musi jeszcze być stworzonym, chociaż go nie potrzebuję. Ale teraz potrzebuję obejścia ...
Jakieś pomysły?
'Porównaj * compare_object;' Powoduje to przeciek pamięci. użyj 'std :: unique_ptr' lub' std :: shared_ptr', zamiast używać 'new' /' delete' bezpośrednio –
ikh
My destructor się tym zajmuje ... Mam "default_created" flagę logiczną i warunkową delecję, don nie martw się :) – Dori
@Niall, będę edytować ... Myślałem, że to nie ma znaczenia – Dori