【问题标题】:can a template value inside a struct contain an object?结构内的模板值可以包含对象吗?
【发布时间】:2017-02-06 15:58:35
【问题描述】:

如果我有类似的结构

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

val 可以是一个对象吗?如果有可能我该怎么做,编译器会告诉我
constructor for element&lt;object&gt; must explicitly initialize the member val which does not have a default constructor.

【问题讨论】:

  • 是的,它可以,它要求你提供任何你试图传递默认构造函数的东西。
  • 看起来T 没有默认构造函数,但是val 可以是一个对象。
  • 你将如何在模板之外构造这个object(或任何导致麻烦的T)?

标签: c++ templates object struct constructor


【解决方案1】:

val 可以是一个对象吗?

是的。一个演示:

element<int> e;

结构element&lt;int&gt; 包含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)
    {}
};

【讨论】:

  • 只是另一个问题,如果我不能使用 c++11 怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2013-05-27
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多