Ho bisogno di passare un comparatore derivato a std::priority_queue
, ma per qualche motivo viene chiamata la classe base 'operator().Impossibile passare derivato Confronta a std :: priority_queue
Ecco un codice minimo che mostra questo comportamento:
class Base {
public:
virtual bool operator() (int l, int r) const {
cout << "Should not be called" << std::endl;
return 0;
}
virtual ~Base() {}
};
class A : public Base {
public:
bool operator() (int l, int r) const override {
cout << "Should be called!!!!";
return l < r;
}
};
int main() {
priority_queue<int, vector<int>, Base> pq((A()));
pq.push(1);
pq.push(2);
pq.push(3);
pq.push(0);
cout << pq.top();
return 0;
}
The code is available on ideone as well
Nota che non posso usare priority_queue<int, vector<int>, A>
, perché ho altre sottoclassi per Base
, e che si tradurrà in un sacco di codice duplicazione .
Cosa sto sbagliando? Come posso passare un comparatore alla priority_queue che verrà utilizzata durante la sua vita?
(1) So che posso ignorare il problema di duplicazione di codice utilizzando le funzioni dei modelli che accettano priority_queue<int,vector<int>, T>
- ma davvero piuttosto non farlo.
@ πάνταῥεῖ Perché affettare? Il costruttore sta accettando 'const Confronta &'. Sono riluttante a credere che in seguito verrà salvato dal valore in una classe di libreria std. – amit
Siamo spiacenti en.cppreference.com è rimasto inattivo per un momento. –
@amit Deve essere salvato dal valore internamente. Se il contenitore stava solo salvando un riferimento, il codice che hai nella domanda sarebbe un comportamento indefinito perché la durata dell'istanza di confronto che si passa al contenitore termina quando la chiamata del costruttore restituisce. – Praetorian