Специализация шаблона функции - PullRequest
13 голосов
/ 14 октября 2010

При чтении этого меня смущают следующие примеры:

// Example 2: Explicit specialization 
// 
template<class T> // (a) a base template 
void f( T );

template<class T> // (b) a second base template, overloads (a) 
void f( T* );     //     (function templates can't be partially 
                  //     specialized; they overload instead)

template<>        // (c) explicit specialization of (b) 
void f<>(int*);

// ...

int *p; 
f( p );           // calls (c)

Здесь (c) - это явная специализация (b).

// Example 3: The Dimov/Abrahams Example 
// 
template<class T> // (a) same old base template as before 
void f( T );

template<>        // (c) explicit specialization, this time of (a)
void f<>(int*);

template<class T> // (b) a second base template, overloads (a) 
void f( T* );

// ...

int *p; 
f( p );           // calls (b)! overload resolution ignores 
                  // specializations and operates on the base 
                  // function templates only

Здесь (c) - это явная специализация (a). Это почему? Это из-за упорядочения декларации?

Ответы [ 3 ]

12 голосов
/ 14 октября 2010

Да, это из-за упорядочения декларации. Когда компилятор встречает (c) во втором наборе, единственный определенный шаблон для специализации - (a).

Вот почему вы должны быть осторожны при заказе специализаций шаблона.

Язык программирования C ++ подробно расскажет об этом (раздел 13.5.1). Я очень рекомендую это.

10 голосов
/ 15 октября 2010

Это заказ, но это не только заказ. Для первого кода оба шаблона были определены ранее. Но второй был взят.

Это потому, что сравниваются два шаблона, и обнаруживается, что (T) соответствует любому типу, который соответствует (T*), но что (T*) не соответствует всем типам, которые соответствуют (T). Таким образом, второй шаблон является более специализированным. Всякий раз, когда вы указываете явную специализацию, и эти два шаблона совпадают, шаблоны сравниваются, а более специализированная ассоциируется с явной специализацией. Это сравнение называется «частичное упорядочение».

8 голосов
/ 15 октября 2010

Стандарт должен сказать следующее об относительном позиционировании явных объявлений специализации. [Раздел 14.7.3]

Размещение явных объявлений специализации для шаблонов функций, шаблонов классов, функций-членов шаблонов классов, статических данных-членов шаблонов классов, классов-членов классов шаблонов, шаблонов классов-членов шаблонов классов, функции-члена шаблоны шаблонов классов, функции-члены шаблонов-членов шаблонов классов, функции-члены шаблонов-членов не шаблонных классов, шаблоны функций-членов классов-членов шаблонов классов и т. д., а также размещение объявлений частичной специализации шаблонов классов, шаблонов классов-членов классов, не являющихся шаблонами, шаблонов классов-членов шаблонов классов и т. д., может повлиять на Программа корректно сформирована в соответствии с относительным расположением деклараций явной специализации и их точками реализации в единице перевода, как указано выше и ниже . При написании специализации будьте осторожны с ее местоположением; или сделать его компиляцией будет таким испытанием, чтобы разжечь его самосожжение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...