2012-06-28 19 views
5

Si tenta di implementare la selezione dell'algoritmo di compilazione utilizzando la specializzazione del modello.Problema di espressione costante di GCC 4.7.1 con sovraccarico

ho l'hashing del seguente codice:

template <class C> 
    struct choose 
    { 
     typedef size_t (*type)(const C*); 
     static constexpr type value = java_string_hashcode<C>; 
    }; 

mi sono specializzato questa struttura per la char Tipo:

template <> 
    struct choose<char> 
    { 
     typedef size_t (*type)(const char*); 
     static constexpr type value = fnv_1a_32_hash; 
    }; 

Ma quando provo a compilare, ottengo il seguente errore con GCC 4.7 .1:

error: field initializer is not constant

Penso che il problema derivi dal fatto che loLa funzioneè sovraccaricata, anche se IMO il cast implicito su size_t (*)(const char*) dovrebbe risolvere questo problema.

ho finalmente trovato una soluzione, da una rinominando il sovraccarico o semplicemente lanciare l'assegnazione:

static constexpr type value = (type)fnv_1a_32_hash; 

La mia domanda è: questo è un bug del compilatore? O mi sta sfuggendo qualcosa? Si prega di spiegare e citare le specifiche ovunque sia necessario.


dettagli di implementazione fnv_1a_32_hash:

constexpr size_t fnv_1a_32_hash(const char* p, size_t h) noexcept 
{ 
    return (*p == 0) ? h : fnv_1a_32_hash(p + 1, (h^*p) * fnv::prime); 
} 

constexpr size_t fnv_1a_32_hash(const char* p) noexcept 
{ 
    return fnv_1a_32_hash(p, fnv::offset_basis); 
} 
+0

Se a tutto, mi piacerebbe pensare che il messaggio di errore è un bug (non riferendosi al sovraccarico essendo il problema). –

risposta

Problemi correlati