2011-01-07 19 views
6

Mam proste klasy:Usuwanie g ++ ostrzeżenie dla parametru szablonu

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

Gdybym określić instancję tej klasy jako:

Int<0, Widget> zero; 

dostaję g ++ ostrzeżenie:

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

Próbowałem to zrobić, ale nie mogłem wymyślić, jak częściowo specjalizować funkcję z parametrem szablonu non-type. Wygląda na to, że wyłączenie tego ostrzeżenia w g ++ może nie być możliwe. Jaki jest właściwy sposób ukrywania tego ostrzeżenia lub pisania tej metody, która zawsze zwraca wartość true, jeśli N == 0?

Dzięki!

+0

wygląda jak gcc bug –

+0

Czy potrzebujesz pełnego zakresu 'size_t', czy możesz iść z podpisem typu? – Bill

+0

@Bill: Niestety potrzebuję całego zakresu :-( – JaredC

Odpowiedz

7

Tak, mam wymyślić następujące rozwiązanie:

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

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

Więc teraz, klasy wygląda następująco:

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

Oczywiście, otrzymuję ostrzeżenie o nieużywanym parametrze, ale są sposoby na obejście tego ...

Czy to rozsądny sol ution?

+0

Tak, powiedziałbym, że tak. – villintehaspam

1

Można specjalizują int dla N = 0.

+0

Próbowałem to zrobić, ale nie sądzę, że możesz częściowo specjalizować funkcję z parametrem szablonu non-type. Czy wiesz, jak to zrobić? – JaredC

+0

szablon klasa Int <0, T> {...} – templatetypedef

+0

Dzięki. Klasa jest bardziej skomplikowana niż mój prosty przykład, więc specjalizacja całej klasy nie jest opcją Czy istnieje sposób na specjalizację tylko funkcji valid()? – JaredC

Powiązane problemy