Недавно я начал изучать C++. И я иногда путаюсь с типовой специализацией. Может ли кто-нибудь сказать мне причину, почему следующая типовая специализация в № (3) является незаконной?шаблон специализации с параметром шаблона
template<typename T> // No (1)
class ClassA {
public:
ClassA();
virtual ~ClassA();
void func(void);
};
template<> // No (2)
void ClassA<int>::func(void) {} // Ok legal specialization
template<typename T> // No (3)
void ClassA<int>::func(void) {} // error by compiler
Кажется, специализация шаблона в No (3) не имеет неявного параметра шаблона, потому что typename T является int. Но компилятор дает следующее сообщение об ошибке,
error: prototype for ‘void ClassA<int>::func()’ does not match any in class ‘ClassA<int>’ void ClassA<int>::func(void) {
^
error: candidate is: void ClassA<T>::func() [with T = int] void func(void);
^
Я боюсь, я задаю глупый вопрос, но я действительно хочу знать причину ошибки. И я удивляюсь, что typename Ts у No 1 и No3 такие же или нет. Пожалуйста, скажите мне их. Большое спасибо.
ни (2), ни (3) не должны компилироваться – bolov
В C++ вы обычно пишете 'func()', а не 'func (void)'. Более поздняя версия разрешена только для обратной совместимости с C. –