Поясните плиз кто в этой ситуации прав(ближе к стандарту):
При компиляции такого кода:
//-------------------------------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
И что с этим делать?
Здравствуйте, 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 {
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Думаю, такой код не вызовет нареканий ни у одного компилятора:
ПК>ПК>template<class T, T defval = 0>
ПК>class alloc_pool {
ПК>
Не вызовет нареканий для инта, а для определенных пользователем типов как же?
... << RSDN@Home 1.0 beta 5 >>
Удалено избыточное цитирование. -- ПК.
Здравствуйте, Дмитрий Наумов, Вы писали:
ПК>>Думаю, такой код не вызовет нареканий ни у одного компилятора:
ПК>>ПК>>template<class T, T defval = 0>
ПК>>class alloc_pool {
ПК>>
ДН>Не вызовет нареканий для инта, а для определенных пользователем типов как же?
Какие именно типы ты имеешь в виду? Нетиповым параметром шаблона могут быть только типы из ограниченного набора: целые и enum-типы, указатели и ссылки. Как видишь, все они, кроме ссылок, могут быть проинициализированы нулем. (А ссылочный тип 'T' и инициализатором вида 'T()' проинициализировать нельзя). Какой-то произвольный пользовательский тип, не входящий в данный набор, не может быть использован в качестве типа 'T'. Так что проблемы просто не существует.