2011-11-21 36 views
8

Así que tengo una matriz (0 - n), con valores que quiero que std :: set use para su clasificación. La matriz es sin signo int costo [n].¿Por qué no puedo construir std :: set con una instanciación de un predicado, pero puedo asignar un std :: set construido de esa manera?

estoy usando el siguiente funtor para esta clasificación:

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; 
}; 

Así que aquí está el problema ... Cuando construyo el conjunto, esto es legal:

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

No me sale errores, y todo funciona como se espera Pero esto parece pirateado y descuidado.

Sin embargo, esto es al parecer ilegal:

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

Tratando de simplemente construir con el ProxySorter (costo) provoca un montón de errores, diciendo cosas como esta para cada llamada miembro de conjunto:

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

¿Cuál es el problema con la construcción regular? ¿Por qué funciona la tarea? ¿Cuál es la diferencia aquí que me estoy perdiendo? Cualquier ayuda muy apreciada, gracias.

Ah, perdón por el título de la pregunta, no estaba seguro de cómo llamar a esto.

Respuesta

13

Most-vexing-parse. Es necesario otro par de paréntesis:

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

de lo contrario se puede interpretar como la declaración de una función que devuelve el tipo de conjunto y teniendo un argumento de tipo llamado ProxySortercost.

+0

¿Por qué, porque de lo contrario se analiza como una declaración de función? Guau. –

+0

Wow. Bueno, nunca me hubiera dado cuenta de eso. –

+0

@John: Sí, mira mi pequeña edición y el enlace. – Xeo

Cuestiones relacionadas