2015-11-17 26 views
6

Mam problemy ze specjalizacjami funkcji składowych, gdy są one szablonowane przy użyciu szablonu variadic.Częściowa specjalizacja funkcji elementu szablonu variadic

Poniższy przykład specjalizuje całą klasę i to działa dobrze:

template<typename... Args> 
class C; 

template<class T, typename... Args> 
class C<T, Args...> { }; 

template<> 
class C<> { }; 

int main() { 
    C<int, double> c{}; 
} 

Poniżej jeden nie, choć idea jest dokładnie taka sama jak ten powyżej:

class F { 
    template<typename... Args> 
    void f(); 
}; 

template<class T, typename... Args> 
void F::f<T, Args...>() { } 

int main() { 
} 

dostaję następujący błąd i nie rozumiem, co to spowodowane:

main.cpp:7:23: error: non-type partial specialization ‘f<T, Args ...>’ is not allowed 
void F::f<T, Args...>() { } 
        ^
main.cpp:7:6: error: prototype for ‘void F::f()’ does not match any in class ‘F’ 
void F::f<T, Args...>() { } 
    ^
main.cpp:3:10: error: candidate is: template<class ... Args> void F::f() 
    void f(); 
     ^

Czy są jakieś ograniczenia, o których nie wiem, kiedy specjalizuję szablon funkcji?

G ++ wersja: g ++ (Debian 5.2.1-23) 5.2.1 20151028

EDIT

Nawiasem mówiąc, rzeczywisty problem Dostaję od rzeczywistych kod to:

non-class, non-variable partial specialization ‘executeCommand<T, Args ...>’ is not allowed 

W każdym razie zredukowany przykład jest podobny do rzeczywistego. Mam nadzieję, że błędy nie są całkowicie niezwiązane.

+2

Szablony funkcji nie mogą być częściowo wyspecjalizowane. –

+0

Masz na myśli * szablon funkcji członka *? – skypjack

+0

@skypjack: członek, a nie członek. – Jarod42

Odpowiedz

12

Nie można częściowo specjalizować szablonów funkcji; dozwolona jest tylko jawna specjalizacja.

Możesz uzyskać prawie taki sam efekt, używając przeciążenia, szczególnie jeśli używasz pojęć takich jak tag dispatching.

+0

Dobra wskazówka. Już korzystałem z wysyłania tagów, ale dziś nie przyszło mi to do głowy !! Dziękuję Ci. – skypjack

Powiązane problemy