2011-11-21 8 views
8

Quindi ho un array (0 - n), con valori che voglio std :: set da usare per il suo ordinamento. L'array è senza firma int costo [n].Perché non posso costruire std :: set con un'istanza di un predicato, ma posso assegnare un oggetto std :: set costruito in quel modo?

Sto utilizzando il seguente funtore per questo ordinamento:

struct ProxySorter { 
    ProxySorter(const unsigned* arr) : proxy_array(arr) {} 
    bool operator()(const unsigned& a, const unsigned& b) const { 
    return proxy_array[a] < proxy_array[b]; 
    } 
    const unsigned* proxy_array; 
}; 

Quindi, ecco il problema ... Quando costruisco il set, questo è legale:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost)); 

non ottengo errori e tutto funziona come previsto. Ma questo sembra violato e sciatto.

Tuttavia, questo è apparentemente illegale:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost)); 

Cercando di costruire solo con il ProxySorter (costo) provoca un po 'di errori, dicendo cose come questa per ogni chiamata membro insieme:

error: request for member erase in node_queue, which is of non-class type std::set<unsigned int, ProxySorter>(ProxySorter)

Qual è il problema con la costruzione normale? Perché il compito funziona? Qual è la differenza qui che mi manca? Qualsiasi aiuto molto apprezzato, grazie.

Oh e mi dispiace per il titolo della domanda, non ero proprio sicuro di come chiamarlo.

risposta

13

Most-vexing-parse. Avete bisogno di un altro paio di parentesi:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost))); 

altrimenti verrà interpretato come la dichiarazione di una funzione che restituisce il tipo di set e di prendere un argomento di tipo ProxySorter nome cost.

+0

Perché, perché altrimenti viene analizzato come una dichiarazione di funzione? Wow. –

+0

Wow. Beh, non l'avrei mai capito. –

+0

@John: Sì, vedi la mia piccola modifica e il link. – Xeo

Problemi correlati