C++ std::转换移动构造函数的模板专门化的变体

C++ std::转换移动构造函数的模板专门化的变体,c++,constructor,move,variant,C++,Constructor,Move,Variant,我使用的类封装了模板专门化的std::变体,例如: template<typename Type> struct Generic_node {...}; struct Leaf_node : Generic_node<...> {...}; struct Inner_node : Generic_node<...> {...}; struct Node {std::variant<Leaf_node, Inner_node> variant_;}

我使用的类封装了模板专门化的std::变体,例如:

template<typename Type> struct Generic_node {...};
struct Leaf_node : Generic_node<...> {...};
struct Inner_node : Generic_node<...> {...};

struct Node {std::variant<Leaf_node, Inner_node> variant_;};
相关编译器错误消息(clang 7,libstdc++-8):

注意:忽略候选模板:替换失败[with _Tp=Base,
$1=void,$2=void]:未定义模板的隐式实例化
'std::variant::__to_type_impl'
变量(_-Tp&&u-t)
问题很可能与变量无关,而是与变量构造函数的模板实例化中
Base==Derived
的相等性有关,编译器似乎没有看到这一点

模板实例化中发生了什么,为什么编译器不能调用提供的构造函数

Edit:因为我打算创建一个专门化,所以我忘记了继承不能暗示类类型相等,即使从技术上讲是在这种特殊情况下。因此,这是一项简单的任务,通过从专业化基础中移动来构建派生:

struct Derived : Base<int>
{
    Derived() = default;
    Derived(Base<int>&&) {}
};
struct-Derived:Base
{
派生()=默认值;
派生(基&&){}
};

如果我是正确的,则需要为基类的每个派生类显式定义构造函数。

在您给出的示例中,派生类是一个独立于基类的类。它们有完全相同的成员、相同的方法,但它们仍然是独立的类

解决此问题的最简单方法是使用
using
语句,而不是将其声明为单独的类:

using Derived = Base<int>;
使用派生=基;

与variant无关,您将出现与
Base b相同的错误;d(b)移动
std::move(派生的{})
是无用的<代码>派生{}
已经是一个右值。似乎您需要一个右值。
struct Derived : Base<int>
{
    Derived() = default;
    Derived(Base<int>&&) {}
};
using Derived = Base<int>;