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);
}
Se a tutto, mi piacerebbe pensare che il messaggio di errore è un bug (non riferendosi al sovraccarico essendo il problema). –