Ich habe dieses Stück Code in anderem ThemaCompile Zeit Hash - Verwirrung auf Vorlage Abzug um
template<size_t N, size_t I = 0>
struct hash_calc
{
static constexpr size_t apply(const char(&s)[N])
{
return (hash_calc < N, I + 1 >::apply(s)^s[I]) * 16777619u;
};
};
template<size_t N>
struct hash_calc<N, N>
{
static constexpr size_t apply(const char(&s)[N])
{
return 2166136261u;
};
};
template<size_t N>
constexpr size_t hash(const char(&s)[N])
{
return hash_calc<N>::apply(s);
}
Zunächst einmal, ich bin gefunden total verwirrt, warum es nicht ein unendlicher rekursiven Aufruf zu sein endet? Von dem, was ich verstehe, zuerst hash_calc<N, I>
wird sich immer selbst anrufen, was bewirkt, dass es bei hash_calc<N, N>
zu brechen, wenn I
N
erreicht? Die Vorlageninstanziierung für hash_calc<N, I>
schlägt nicht fehl, wenn N == I
. Zweitens - ich habe versucht, kopieren Sie die hash_calc<N, N>
Struktur über hash_calc<N, I>
, die Kompilierungsfehler error: 'hash_calc' is not a class template struct hash_calc<N, N>
verursacht. Warum das?!
Edit: Der modifizierte Code unten kompiliert nicht unter msvc noch gcc. Ich habe gerade eine Vorlage über andere gelegt. Was ist passiert?
template<size_t N>
struct hash_calc<N, N>
{
static constexpr size_t apply(const char(&s)[N])
{
return 2166136261u;
};
};
template<size_t N, size_t I = 0>
struct hash_calc
{
static constexpr size_t apply(const char(&s)[N])
{
return (hash_calc < N, I + 1 >::apply(s)^s[I]) * 16777619u;
};
};
template<size_t N>
constexpr size_t hashq(const char(&s)[N])
{
return hash_calc<N>::apply(s);
}
Der Template-Instanziierungsprozess verwendet wann immer möglich eine partielle Spezialisierung über die primäre Vorlage. Das ist schließlich der springende Punkt, Spezialisierungen bereitzustellen - damit sie verwendet werden, wenn sie mit den tatsächlichen Argumenten übereinstimmen. Sie scheinen zu glauben, dass die primäre Vorlage nicht instanziiert werden kann, bevor die Spezialisierung berücksichtigt wird - das ist nicht der Fall. –
* "Ich habe versucht, die' hash_calc 'struct über' hash_calc '* Ich habe nicht verstanden, was Sie damit meinen. Wenn Sie einen Code haben, der einen Compilerfehler verursacht, zeigen Sie diesen Code und den genauen Text des Compilerfehlers an. –
Ich habe den ersten Beitrag geändert – QQemka