Вопрос специализации шаблона класса C ++ - PullRequest
2 голосов
/ 18 июля 2011

Глядя на следующий код, меня смущает строка 3.
Строка 3 не является частным случаем базового шаблона, она больше похожа на «перегрузку класса».Но он может быть успешно скомпилирован.
Объект obj1 в строке 7 определен в соответствии со строкой 3, но не скомпилирован.
Почему?

template<typename S,int T, void(* U)()> class Bar{};  // Base template
template<int T, void(* U)()> class Bar<double, T, U>{}; // Specialization, which is good
template<int T, void(* U)()> class Bar<double, U, T>{}; // Also good, how come?

void func(){};
int main(){
   //Bar<double, func, 1> obj1;   // Error, from line 3
}

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

Шаблоны особенные: все, что вы не используете, на самом деле не создается (компилируется). Это позволяет делать много интересных вещей с помощью определенных шаблонов. Например, вы можете определить функции-члены, которые просто не будут компилироваться с определенными параметрами типа, но до тех пор, пока вы не будете использовать эти члены, никаких ошибок.

Это также может укусить вас: строка 3 на самом деле не является правильной - это некомпилирующая специализация Bar - но вы не заметите это, пока не попробуете использовать ее в своей функции main ().

3 голосов
/ 18 июля 2011

Пока эта форма нигде не используется - компилятор не будет жаловаться.Если он используется, и компилятор должен создать его экземпляр - тогда он будет жаловаться.Вот почему, если вы раскомментируете, вы получите ошибку - в этот момент компилятор видит ошибочную частичную специализацию.

...