繁体   English   中英

'X' 类型不是 'Y' 的直接类型 - 但带有 std::conditional

[英]type 'X' is not a direct type of 'Y' - but with std::conditional

我有一个 Base 类,两个类继承自该基类(它们彼此略有不同)和一个 Last 类,它可以基于模板从Derived1Derived2继承。 我使用std::conditional在编译时确定它应该实际使用哪个DerivedX

template< class >
class Base;

template< class T, class ...Args >
class Base < T(Args...) >
{
public:
    Base(int a) { std::cout << "Base constructor " << a << std::endl; }
};

template< class >
class Derived1;

template< class ...Args >
class Derived1 < void(Args...) > : public Base< void(Args...) >
{
public:
    Derived1(int a) : Base< void(Args...) >(a)
        { std::cout << "Derived1 constructor " << a << std::endl; }
};

template< class >
class Derived2;

template< class T, class ...Args >
class Derived2 < T(Args...) > : public Base< T(Args...) >
{
public:
    Derived2(int a) : Base< T(Args...) >(a)
        { std::cout << "Derived2 constructor " << a << std::endl; }
};

template< class >
class Last;

template< class T, class ...Args >
class Last< T(Args...) > : public std::conditional<
    std::is_void<T>::value,
    Derived1< void(Args...) >,
    Derived2< T(Args...) > >
{
public:
    Last(int a) : std::conditional<
        std::is_void<T>::value,
        Derived1< void(Args...) >,
        Derived2< T(Args...) > >::type(a)
    { std::cout << "Last constructor " << a << std::endl; }
};

int main()
{
    Last<int(int)> last(1);

    return 0;
}

我已经阅读了有关钻石遗产和虚拟继承的多个主题,并且得到了与这些主题相同的错误: type Derived2<...> is not a base class of Last<...> 但是,这些主题从不使用std::conditional 顺便说一句,它编译得很好,直到我尝试实例化一个Last对象。 有什么我想念的吗? 甚至可以这样做吗?

在您的基类声明中:

template< class T, class ...Args >
class Last< T(Args...) > : public std::conditional<
    std::is_void<T>::value,
    Derived1< void(Args...) >,
    Derived2< T(Args...) > >
{
...
}

您要么需要说public std::conditional_t (其中_t在末尾非常重要),要么需要在std::conditional模板参数之后放置::type ,如下所示:

template< class T, class ...Args >
class Last< T(Args...) > : public std::conditional<
    std::is_void<T>::value,
    Derived1< void(Args...) >,
    Derived2< T(Args...) > >::type
{
...
}

否则,您的基本类型是std::conditional并且您正在尝试 mem-initialize Derived2 ,这不是同一类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM