递归模板参数:调用隐式删除的默认构造函数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}}; }