кого специализировали
От: Аноним  
Дата: 02.02.04 11:34
Оценка:
template<class T>
void fun(T);
template<class T>
void fun(T *);

template<>
void fun(int *)
{
}


непоняно, как компилятор разбирается, какую я функцию явно специализировал (это и мне самому тут непонятно) — а он спокойно компилит.
Re: кого специализировали
От: PM  
Дата: 02.02.04 11:51
Оценка:
Здраствуйте, . Вы писали:

>
 > template<class T>
 > void fun(T);
 > template<class T>
 > void fun(T *);

 > // template<> 
 > void fun(int *)
 > {
 > }
 >


> непоняно, как компилятор разбирается, какую я функцию явно

> специализировал (это и мне самому тут непонятно) — а он спокойно
> компилит.
добавим тест
int main()
{
    int i = 0;
    char c = 0;
  
    fun(i);       // fun(T)
    fun(&i);    // fun(int*)
    fun(c);     // fun(T)
    fun(&c);   // fun(T*)

    fun( (int*)&c );   // нагло врём о типе параметра - получаем вызов fun(int*)
}

На самом деле это перегрузка функций (специализация применяется только для шаблонных классов). Компилятор выбирает нужную функцию, ориентируясь на тип параметра. Это хорошо видно на последнем примере
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re: кого специализировали
От: Павел Кузнецов  
Дата: 02.02.04 12:05
Оценка: 6 (1)
Здравствуйте, , Вы писали:

>
 > template<class T>
 > void fun(T);

 > template<class T>
 > void fun(T *);

 > template<>
 > void fun(int *)
 > {
 > }
 >


> непоняно, как компилятор разбирается, какую я функцию

> явно специализировал (это и мне самому тут непонятно) -
> а он спокойно компилит.

Компилятор определяет, какой из шаблонов специализирован, по тем же правилам, что и при вызове функции без явного указания аргументов шаблона. В данном случае для разрешения перегрузки компилятор должен использовать так называемое частичное упорядочение шаблонов функций (14.5.5.2):

2 Given two overloaded function templates, whether one is more specialized than another can be determined by transforming each template in turn and using argument deduction (14.8.2) to compare it to the other.
3 The transformation used is:
— For each type template parameter, synthesize a unique type and substitute that for each occurrence of that parameter in the function parameter list, or for a template conversion function, in the return type.
— For each nontype template parameter, synthesize a unique value of the appropriate type and substitute that for each occurrence of that parameter in the function parameter list, or for a template conversion function, in the return type.
— For each template template parameter, synthesize a unique class template and substitute that for each occurrence of that parameter in the function parameter list, or for a template conversion function, in the return type.
4 Using the transformed function parameter list, perform argument deduction against the other function template. The transformed template is at least as specialized as the other if, and only if, the deduction succeeds and the deduced parameter types are an exact match (so the deduction does not rely on implicit conversions).
5 A template is more specialized than another if, and only if, it is at least as specialized as the other template and that template is not at least as specialized as the first.


В 14.7.3 — ошибка. http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#64
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: кого специализировали
От: Lorenzo_LAMAS  
Дата: 02.02.04 12:07
Оценка:
PM>На самом деле это перегрузка функций (специализация применяется только для шаблонных классов).

На самом деле это явная специализация функций.
Of course, the code must be complete enough to compile and link.
Re[3]: кого специализировали
От: PM  
Дата: 02.02.04 12:13
Оценка:
Здраствуйте, Lorenzo_LAMAS. Вы писали:

PM>> На самом деле это перегрузка функций (специализация применяется только

PM>> для шаблонных классов).

LL> На самом деле это явная специализация функций.

Оба прогнали — ПК, как всегда, прав
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[4]: кого специализировали
От: Lorenzo_LAMAS  
Дата: 02.02.04 12:15
Оценка:
PM>Оба прогнали — ПК, как всегда, прав

Нет, я не прогнал, это специализация функции, просто я не знал — какой. Павел объяснил
Of course, the code must be complete enough to compile and link.
Re[5]: кого специализировали
От: PM  
Дата: 02.02.04 12:51
Оценка:
Здраствуйте, Lorenzo_LAMAS. Вы писали:

PM>> Оба прогнали — ПК, как всегда, прав


LL> Нет, я не прогнал, это специализация функции, просто я не знал — какой.

LL> Павел объяснил
Начал разбираться в терминах, полез в 14.5.5.1 и ещё больше запутался. Какая же разница между
function template overloading и function template specializations?
template<class T>
void fun(T);

template<class T>  // specialization?
void fun(T*);

template<>             // specialization?
void fun(int);

template<>            // specialization?
void fun(int);

void fun(char);    // overloading?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[6]: кого специализировали
От: Павел Кузнецов  
Дата: 02.02.04 12:55
Оценка: 4 (1)
Здравствуйте, PM, Вы писали:

P> Какая же разница между function template overloading и function template

P> specializations?

P>
 P> template<class T>
 P> void fun(T);

 P> template<class T>  // specialization?
 P> void fun(T*);
 P>


Нет, overloading.

См. выделенное:

P>
 P> template<>             // specialization?
 P> void fun(int);

 P> template<>            // specialization?
 P> void fun(int);
 P>


Да, explicit specialization.

P>
 P> void fun(char);    // overloading?
 P>


Без последнего — перегрузка шаблонов.
С последним — перегрузка шаблонов и "обычной" функции.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: кого специализировали
От: Lorenzo_LAMAS  
Дата: 02.02.04 12:59
Оценка: 4 (1)
Здравствуйте, PM, Вы писали:

Блин, ты меня ща запутаешь совсем Остатки "знаний" потеряю

PM>template<class T>
PM>void fun(T);

PM>template<class T>  // specialization? нет, это перегрузка
PM>void fun(T*);

PM>template<>             // specialization? да, это явная (explicit) специализация
PM>void fun(int);

PM>template<>            // specialization? да, повторное объявление той же специалиации
PM>void fun(int);

PM>void fun(char);    // overloading? да, перегрузка нешаблонной функцией
PM>


Кстати, вот VC 7.0. очень прикольно глюкает:
template<class T>
void fun(T);

template<>
viod fun(int)
{
}

void fun(int);

void g()
{
   fun(10);
}


Преспокойно, негодник, вызывает специализацию — хотя должен быть анрезолвед.
Of course, the code must be complete enough to compile and link.
Re[7]: кого специализировали
От: amid  
Дата: 02.02.04 13:18
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Кстати, вот VC 7.0. очень прикольно глюкает:

L_L>
L_L>template<class T>
L_L>void fun(T);

L_L>template<>
L_L>viod fun(int)
L_L>{
L_L>}

L_L>void fun(int);

L_L>void g()
L_L>{
L_L>   fun(10);
L_L>}
L_L>


L_L>Преспокойно, негодник, вызывает специализацию — хотя должен быть анрезолвед.


Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация).
Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).
... << RSDN@Home 1.1.0 stable >>
Re[8]: кого специализировали
От: Lorenzo_LAMAS  
Дата: 02.02.04 13:29
Оценка:
A>Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация).
A>Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).

хехе, в том то и суть, что предпочел, а определения то нету! только объявление
Of course, the code must be complete enough to compile and link.
Re[8]: кого специализировали
От: Аноним  
Дата: 02.02.04 13:30
Оценка: +1
Здравствуйте, amid, Вы писали:

A>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>Кстати, вот VC 7.0. очень прикольно глюкает:

L_L>>
L_L>>template<class T>
L_L>>void fun(T);

L_L>>template<>
L_L>>viod fun(int)
L_L>>{
L_L>>}

L_L>>void fun(int);

L_L>>void g()
L_L>>{
L_L>>   fun(10);
L_L>>}
L_L>>


L_L>>Преспокойно, негодник, вызывает специализацию — хотя должен быть анрезолвед.


A>Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация).

A>Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).

А где ты у обычной функции тело видишь?
Re[9]: кого специализировали
От: amid  
Дата: 02.02.04 13:43
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

A>>Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация).

A>>Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).

L_L>хехе, в том то и суть, что предпочел, а определения то нету! только объявление


Ага, таки да, не заметил

Однако, 7.1 в данном случае компилирует, но не может слинковать, что, в принципе, ожидаемо.
... << RSDN@Home 1.1.0 stable >>
Re[2]: кого специализировали
От: Lorenzo_LAMAS  
Дата: 03.02.04 10:02
Оценка:
template<class T>
void fun(T);

template<class T>
void fun(T *);

void g()
{
    fun<int *>(0);
}


Павел, а здесь тоже partial reordering ?
Of course, the code must be complete enough to compile and link.
Re[3]: кого специализировали
От: Павел Кузнецов  
Дата: 03.02.04 13:22
Оценка: 2 (1)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>
 LL> template<class T>
 LL> void fun(T);

 LL> template<class T>
 LL> void fun(T *);

 LL> void g()
 LL> {
 LL>     fun<int *>(0);
 LL> }
 LL>


LL> Павел, а здесь тоже partial reordering ?


Да. Частичное упорядочение используется в любом случае, когда возникает
неоднозначность при разрешении перегрузки шаблонов функций. В данном случае
будет вызвана специализация второго шаблона.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: кого специализировали
От: vdimas Россия  
Дата: 03.02.04 13:54
Оценка:
Здравствуйте, amid, Вы писали:

A>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>Кстати, вот VC 7.0. очень прикольно глюкает:


Да, есть такой глюк у него, он рассматривает твою вторую ф-ию как СПЕЦИАЛИЗАЦИЮ.

Попробуй дать ей тело
И этот глюк расцветет в своей красе.

В 7.1 они это исправили, как исправили еще кучу вещей. Так все срочно прыгаем на 7.1
Re[9]: кого специализировали
От: Lorenzo_LAMAS  
Дата: 03.02.04 13:58
Оценка: :)
V>В 7.1 они это исправили, как исправили еще кучу вещей. Так все срочно прыгаем на 7.1

"Нафиг мне эта анаша, у меня ведь есть своя" ((с)Красная плесень)

У меня интел. Правда некоторыми своими особенностями тоже не радует.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.