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++中做了一个代数数据类型(二进制和类型)和二进制(二进制乘积类型),我想实现这两个的组合,在那里可以有一个或两个;代码>EItheral_C++_Templates - Fatal编程技术网

递归模板参数:调用隐式删除的默认构造函数C++; 我在C++中做了一个代数数据类型(二进制和类型)和二进制(二进制乘积类型),我想实现这两个的组合,在那里可以有一个或两个;代码>EItheral

递归模板参数:调用隐式删除的默认构造函数C++; 我在C++中做了一个代数数据类型(二进制和类型)和二进制(二进制乘积类型),我想实现这两个的组合,在那里可以有一个或两个;代码>EItheral,c++,templates,C++,Templates,下面是或 template <typename T1, typename T2> class Either { public: bool left; T1 lx; T2 rx; template <typename T1_, typename T2_> friend Either<T1_, T2_> Left(T1_ *x); template <typename T1_, typename T2_> friend Ei

下面是

template <typename T1, typename T2>
class Either
{
public:
  bool left;
  T1 lx;
  T2 rx;
  template <typename T1_, typename T2_>
  friend Either<T1_, T2_> Left(T1_ *x);
  template <typename T1_, typename T2_>
  friend Either<T1_, T2_> Right(T2_ *x);
};

template <typename T1_, typename T2_>
Either<T1_, T2_> Left(T1_ x)
{
  Either<T1_, T2_> e;
  e.left = true;
  e.lx = x;
  return e;
}

template <typename T1_, typename T2_>
Either<T1_, T2_> Right(T2_ x)
{
  Either<T1_, T2_> e;
  e.left = false;
  e.rx = x;
  return e;
}
构造它会导致错误

EitherAll<int,char> res = Right<Both<int,char>,Either<int,char>>(Left<int,char>(1));
eitheral res=右(左(1));
错误:调用隐式删除的“任一”的默认构造函数 要么是e

添加一个默认构造函数
or(){}
需要实例化
lx,rx
,而不是延迟,并且只在
左、右
中提供。我不知道如何使这个数据结构工作


下面是代码片段的一部分

您的
都需要默认构造T1/T2

/可能有助于:

/*! Disjoint sum type of two parameters */
template <typename T1, typename T2>
class Either
{
public:
  std::variant<T1, T2> data;
};

template <typename T1, typename T2>
Either<T1, T2> Left(T1 x) { return {std::variant<T1, T2>{std::in_place_index_t<0>{}, x}}; }

template <typename T1, typename T2>
Either<T1, T2> Right(T2 x) { return {std::variant<T1, T2>{std::in_place_index_t<1>{}, x}}; }
/*!两个参数的不相交和型*/
模板
类或
{
公众:
std::变量数据;
};
模板
左(T1 x){return{std::variant{std::in_place_index_t{},x};}
模板
右(t2x){return{std::variant{std::in_place_index_t{},x};}

.

我可能应该学习如何使用联合,对吗?问题在于
Both
,它没有默认构造函数,因此编译器无法为包含
Both
成员的
eitheral
创建默认构造函数
EitherAll<int,char> res = Right<Both<int,char>,Either<int,char>>(Left<int,char>(1));
/*! Disjoint sum type of two parameters */
template <typename T1, typename T2>
class Either
{
public:
  std::variant<T1, T2> data;
};

template <typename T1, typename T2>
Either<T1, T2> Left(T1 x) { return {std::variant<T1, T2>{std::in_place_index_t<0>{}, x}}; }

template <typename T1, typename T2>
Either<T1, T2> Right(T2 x) { return {std::variant<T1, T2>{std::in_place_index_t<1>{}, x}}; }