Próbuję częściowej specjalizacji C ++ z klasami. Pytanie dotyczy bardziej składni niż semantyki. Właściwie chcę mieć coś takiego:
int main()
{
...
Reduce<int, float> r(new int, new float);
Reduce<int> r2(new int); // partial template specialization?
...
}
Aby osiągnąć powyższe, próbowałem:
template <typename T, typename U>
class Reduce {
public:
Reduce(T *t, U *u) { }
};
template <typename T>
class Reduce<T,T> {
public:
Reduce(T *t) { }
};
W przypadku powyższego kodu nie mogę użyć następującej instrukcji:
Reduce<int> r2(new int); // error: wrong number of template arguments (1, should be 2)
Nadal muszę zrobić:
Reduce<int, int> r2(new int);
Czy ktoś może wyjaśnić: (1) Jak mogę osiągnąć pożądaną składnię (jeśli to możliwe) (2) jeśli nie jest to możliwe, dlaczego? (tj. problemy techniczne)
Odpowiedzi:
5 dla odpowiedzi № 1Określ domyślny typ drugiego typu szablonu:
template <typename T, typename U = int>
class Reduce {
public:
Reduce(T *t, U *u) { }
};
lub domyślnie taki sam jak pierwszy typ szablonu:
template <typename T, typename U = T>
class Reduce {
public:
Reduce(T *t, U *u) { }
};
Widzieć http://ideone.com/5RcEG na przykład.
4 dla odpowiedzi nr 2
W zależności od tego, czego ostatecznie chcesz, może to być rozwiązanie, ale przynajmniej kompiluje:
template <typename... T>
class Reduce;
template <typename T, typename U>
class Reduce<T,U> {
public:
Reduce(T *t, U *u) { }
};
template <typename T>
class Reduce<T> {
public:
Reduce(T *t) { }
};
int main()
{
Reduce<int, float> r(new int, new float);
Reduce<int> r2(new int); // partial template specialization?
}
0 dla odpowiedzi № 3
Z deklaracji szablonu
template <typename T>
class Reduce<T,T> {
public:
Reduce(T *t) { }
};
widać, że musisz podać 2 argumenty szablonu w celu zmniejszenia. Zmień też swoje użycie
Reduce<int,int> r2(new int)