Может ли val быть объектом?
Да. Демонстрационная:
element<int> e;
Структура element<int>
содержит объект-член типа int
.
constructor for element<object> must explicitly initialize the member val which does not have a default constructor.
element
как вы определили, что по умолчанию будет строить val
член. Поэтому для этого требуется, чтобы T
по умолчанию был конструктивным. Это ограничение не имеет ничего общего с тем фактом, что element
является шаблоном, он также предназначен для не-шаблонов.
Сообщение об ошибке сообщает, что вы создали экземпляр шаблона с аргументом типа, который по умолчанию не является конструктивным. Для поддержки таких типов вам нужен пользовательский конструктор для element
. Например:
template<typename T>
struct element{
T val;
template<class... Args>
element(Args&&... args)
: val(std::forward<Args>(args)...)
{}
};
// ...
element<non_default_constructible> e(42);
что, если я не могу использовать C++ 11?
Вы можете инициализировать элемент копией. Это, конечно, требует, чтобы обернутый тип должен быть скопирован:
template<typename T>
struct element{
T val;
element(T other)
: val(other)
{}
};
Да, он может и просит вас передать все, что вы пытаетесь передать по умолчанию. – George
Похоже, что 'T' не имеет конструктора по умолчанию, но да' val' может быть объектом. – imreal
Как бы вы построили этот «объект» (или что-то вроде 'T', вызывающее проблемы) за пределами шаблона? – doctorlove