Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构中的模板值是否可以包含对象?_C++_Templates_Object_Struct_Constructor - Fatal编程技术网

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)
    {}
};