2017-02-06 10 views
-1

Если у меня есть, как-структуруМожет ли значение шаблона внутри структуры содержать объект?

template<typename T> 
struct element{ 
    T val; 
}; 

Может VAL быть объектом? И если возможно, как я могу это сделать, компилятор сообщает мне
constructor for element<object> must explicitly initialize the member val which does not have a default constructor.

+0

Да, он может и просит вас передать все, что вы пытаетесь передать по умолчанию. – George

+0

Похоже, что 'T' не имеет конструктора по умолчанию, но да' val' может быть объектом. – imreal

+0

Как бы вы построили этот «объект» (или что-то вроде 'T', вызывающее проблемы) за пределами шаблона? – doctorlove

ответ

2

Может ли 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) 
    {} 
}; 
+0

Спасибо! очень хорошее объяснение и пример – user7337963

+0

просто другой вопрос, что делать, если я не могу использовать C++ 11? – user7337963

+1

@ user7337963 см. Редактировать – user2079303