2012-06-28 10 views
5

Próbuję wprowadzić wybór algorytmu kompilacji przy użyciu specjalizacji szablonów.GCC 4.7.1 uogólniony problem z ciągłym wyrażaniem z przeciążeniem

I hash następujący kod:

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

Mam specjalizuje tę strukturę za char typu:

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

ale gdy próbuję go skompilować, pojawia się następujący błąd z GCC 4.7 .1:

error: field initializer is not constant

Myślę, że problem wynika z faktu, żeFunkcjajest przeciążona, nawet jeśli IMO niejawny rzutowany na size_t (*)(const char*) powinien rozwiązać ten problem.

mam w końcu znaleźć sposób obejścia problemu, albo przez zmianę nazwy przeciążenie lub po prostu rzucając przyznawanie:

static constexpr type value = (type)fnv_1a_32_hash; 

Moje pytanie brzmi:: jest to błąd kompilatora? Czy może czegoś brakuje? Proszę wyjaśnić i zacytować specyfikacje tam, gdzie jest to konieczne.


szczegóły implementacji 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

Jeśli w ogóle, to myślę, że komunikat o błędzie jest błąd (nie odnosi się do przeciążenia bycie problemem). –

Odpowiedz

Powiązane problemy