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.
Szablony funkcji nie mogą być częściowo wyspecjalizowane. –
Masz na myśli * szablon funkcji członka *? – skypjack
@skypjack: członek, a nie członek. – Jarod42