Я уже задавал подобный вопрос раньше, понял, что могу заставить его работать частично за счет специализации. Но чтобы понять основы шаблонов, я изменил код следующим образом.
template<typename T, typename... args>
struct counter{
static const int value= 1+ counter<args...>::value;
};
template<typename T>
struct counter<T>{
static const int value = 0;
};
ошибка : «извините, не реализовано: невозможно развернуть« args ... »в список аргументов фиксированной длины»
Я понимаю, что это ошибка, и она была исправлена в gcc 4.7.0
так что, чтобы исправить все это, мы должны использовать трюк или что-то еще, что частично специализирует шаблон.
template<typename... Args> struct counter;
template<>
struct counter<> {
static const int value = 0;
};
template<typename T, typename... Args>
struct counter<T, Args...> {
static const int value = 1 + counter<Args...>::value;
};
Актуальный вопрос : поэтому я действительно хочу знать, какой особый эффект дает частичная специализация, чтобы код работал, или я должен спросить, как частичная специализация решает проблему? (почему вторая версия не попадает в ошибку?). Любое объяснение с проблемой мотивации и примерами будет очень полезно.