2011-01-07 8 views
6

Ich habe eine einfache Klasse:Entfernen g ++ Warnung für Template-Parameter

template<size_t N, typename T> 
class Int 
{ 
    bool valid(size_t index) { return index >= N; } 
    T t; 
} 

Wenn ich eine Instanz dieser Klasse definieren als:

Int<0, Widget> zero; 

erhalte ich eine g ++ Warnung:

warning: comparison is always true due to limited range of data type 

Ich habe versucht, dies zu tun, aber ich konnte nicht herausfinden, wie eine Funktion mit einem nicht-type Template-Parameter teilweise spezialisieren. Es scheint, als wäre es möglicherweise nicht möglich, diese Warnung in g ++ zu deaktivieren. Was ist der richtige Weg, um diese Warnung entweder auszublenden oder diese Methode so zu schreiben, dass sie immer wahr zurückgibt, wenn N == 0?

Danke!

+0

sieht aus wie ein GCC-Bug –

+0

Benötigen Sie den vollen Bereich von 'size_t', oder könnten Sie mit einem signierten Typ gehen? – Bill

+0

@Bill: Leider brauche ich den ganzen Bereich :-( – JaredC

Antwort

7

So spezialisieren, ich habe mit folgenden Lösung gekommen:

template<size_t N> 
bool GreaterThanOrEqual(size_t index) 
{ 
    return index >= N; 
} 

template<> 
bool GreaterThanOrEqual<0l>(size_t index) 
{ 
    return true; 
} 

So, jetzt die Klasse wie folgt aussieht:

template<size_t N, typename T> 
class Int 
{ 
    bool valid(size_t index) { return GreaterThanOrEqual<N>(index); } 
    T t; 
} 

Natürlich bekomme ich eine unbenutzte Parameter-Warnung, aber es gibt Möglichkeiten, um das ....

Ist das ein vernünftiges Sol Ution?

+0

Ja, würde ich sagen, es ist. – villintehaspam

1

Sie können int für N = 0.

+0

Ich habe versucht, dies zu tun, aber ich denke nicht, dass Sie eine Funktion mit einem nicht-type Template-Parameter teilweise spezialisieren können. Wissen Sie, wie man das tut? – JaredC

+0

Vorlage Klasse Int <0, T> {...} – templatetypedef

+0

Danke.Die Klasse ist eigentlich komplizierter als mein einfaches Beispiel, also ist die Spezialisierung der ganzen Klasse keine Option.Verfügt man nur über die valide() Funktion? – JaredC

Verwandte Themen