[英]type 'X' is not a direct type of 'Y' - but with std::conditional
我有一个 Base 类,两个类继承自该基类(它们彼此略有不同)和一个 Last 类,它可以基于模板从Derived1
或Derived2
继承。 我使用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.