Должны ли функции со специализацией шаблона по значению также иметь в своем объявлении?

#c #templates #specialization

#c #шаблоны #специализация

Вопрос:

Я пишу класс, который имеет шаблонную специализацию по значению, и мне было интересно, должны ли конструктор и методы с шаблонной специализацией также иметь <ЗНАЧЕНИЕ> в своем объявлении.

Другими словами, какой из следующих двух примеров правильный?

A)

 template <int i>
class MyClass {};

template <>
class MyClass<0> {
  public: 
    MyClass<0>() {         // specialization value included
      // initialize stuff
    }
    void PrintClass<0> () {     // specialization value included
      // print stuff 
    }
 }
  

Б)

 template <int i>
class MyClass {};

template <>
class MyClass<0> {
  public: 
    MyClass() {            // specialization value NOT included
      // initialize stuff
    }
    void PrintClass () {        // specialization value NOT included
      // print stuff 
    }
 }
  

Комментарии:

1. Там будет введенное имя класса, MyClass ссылающееся на MyClass<0> .

2. В @dyp отсутствуют неприятные макросы, они, вероятно, есть 😉

3. @dyp: Теперь добавлены возвращаемые типы. Спасибо

4. @dyp: возможно, вопрос n00b, но что это значит — «будет введенный MyClass с именем класса, ссылающийся на MyClass<0>»?

5. @raovgarimella везде внутри класса MyClass означает MyClass<i> для шаблона класса или MyClass<0> для специализации для i==0 . имя MyClass буквально «вводится» в его собственную область видимости.