Аргументы шаблона класса (VC6.0 vs VC++7 NET)
От: Art Россия  
Дата: 17.02.03 16:07
Оценка:
Поясните плиз кто в этой ситуации прав(ближе к стандарту):
При компиляции такого кода:

//-------------------------------Templ.h----------------
template<class T, T defval = T()>
class alloc_pool {
public:
      alloc_pool() {};
      ~alloc_pool() {};
};
//-------------------------------End of Templ.h----------------


//-------------------------------Templ.cpp-----------------------
#include "Templ.h"

void main(){
    alloc_pool<int> a;
}
//-------------------------------End of Templ.cpp----------------



VC6.0 прекрасно компилирует и код выполняется

VC7.NET сообщает:

Templ.h error C2975: 'alloc_pool' : invalid template argument for 'defval', constant expression expected


И что с этим делать?
Re: Аргументы шаблона класса (VC6.0 vs VC++7 NET)
От: Павел Кузнецов  
Дата: 17.02.03 16:31
Оценка: 7 (2)
Здравствуйте, Art, Вы писали:

Art>
Art>template<class T, T defval = T()>
Art>class alloc_pool {
Art>


Art>VC6.0 прекрасно компилирует и код выполняется

Art>VC7.NET сообщает: <...> constant expression expected

В некотором роде это спорный вопрос... С одной стороны, 5.19/1 не дает явного разрешенея использовать
T() в интегральных константных выражениях. С другой, разрешает использовать преобразования типов.
При этом, выражение T() описано в пункте 5.2.3 Explicit type conversion (functional notation)...
Более того, по этому поводу имеется соответствующий defect report.

В принципе, я бы сказал, что int() скорее является интегральным константным выражением, чем нет :-)
Современные компиляторы (Comeau, Borland, Gcc), кроме VC7, с этим утверждением согласны.

Art>И что с этим делать?


Думаю, такой код не вызовет нареканий ни у одного компилятора:

template<class T, T defval = 0>
class alloc_pool {
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Аргументы шаблона класса (VC6.0 vs VC++7 NET)
От: Дмитрий Наумов  
Дата: 18.02.03 07:28
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Думаю, такой код не вызовет нареканий ни у одного компилятора:


ПК>
ПК>template<class T, T defval = 0>
ПК>class alloc_pool {
ПК>


Не вызовет нареканий для инта, а для определенных пользователем типов как же?
... << RSDN@Home 1.0 beta 5 >>

Удалено избыточное цитирование. -- ПК.
Re[3]: Аргументы шаблона класса (VC6.0 vs VC++7 NET)
От: Андрей Тарасевич Беларусь  
Дата: 18.02.03 07:43
Оценка: 16 (4)
Здравствуйте, Дмитрий Наумов, Вы писали:

ПК>>Думаю, такой код не вызовет нареканий ни у одного компилятора:


ПК>>
ПК>>template<class T, T defval = 0>
ПК>>class alloc_pool {
ПК>>


ДН>Не вызовет нареканий для инта, а для определенных пользователем типов как же?


Какие именно типы ты имеешь в виду? Нетиповым параметром шаблона могут быть только типы из ограниченного набора: целые и enum-типы, указатели и ссылки. Как видишь, все они, кроме ссылок, могут быть проинициализированы нулем. (А ссылочный тип 'T' и инициализатором вида 'T()' проинициализировать нельзя). Какой-то произвольный пользовательский тип, не входящий в данный набор, не может быть использован в качестве типа 'T'. Так что проблемы просто не существует.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.