C++ 结构中的模板值是否可以包含对象?
如果我有一个像C++ 结构中的模板值是否可以包含对象?,c++,templates,object,struct,constructor,C++,Templates,Object,Struct,Constructor,如果我有一个像 template<typename T> struct element{ T val; }; 模板 结构元素{ T值; }; val可以是一个对象吗?如果可能的话,编译器会告诉我元素的构造函数必须显式初始化没有默认构造函数的成员val val可以是一个对象吗 对。演示: element<int> e; 元素如您所定义,它将默认构造val成员。因此它要求T是默认可构造的。这个限制与元素是一个模板这一事实无关,它也适用于非模板 错误消息告诉您已使
template<typename T>
struct element{
T val;
};
模板
结构元素{
T值;
};
val可以是一个对象吗?如果可能的话,编译器会告诉我元素的构造函数必须显式初始化没有默认构造函数的成员val
val可以是一个对象吗
对。演示:
element<int> e;
元素
如您所定义,它将默认构造val
成员。因此它要求T
是默认可构造的。这个限制与元素
是一个模板这一事实无关,它也适用于非模板
错误消息告诉您已使用不可默认构造的类型参数实例化模板。要支持此类类型,您需要为元素
自定义构造函数。例如:
template<typename T>
struct element{
T val;
template<class... Args>
element(Args&&... args)
: val(std::forward<Args>(args)...)
{}
};
// ...
element<non_default_constructible> e(42);
模板
结构元素{
T值;
模板
元素(Args&…Args)
:val(标准::转发(参数)…)
{}
};
// ...
元素e(42);
如果我不能使用c++11怎么办 您可以通过复制来初始化成员。这当然要求包装类型必须是可复制的:
template<typename T>
struct element{
T val;
element(T other)
: val(other)
{}
};
模板
结构元素{
T值;
元素(T其他)
:val(其他)
{}
};
是的,它可以,它要求你给出你试图传递的默认构造函数。看起来T
没有默认构造函数,但是是的val
可以是一个对象。你将如何构造这个对象
(或者无论T
是什么引起了麻烦)模板之外?还有一个问题,如果我不能使用c++11怎么办?
template<typename T>
struct element{
T val;
element(T other)
: val(other)
{}
};