C++ 使用相互继承的类的模板化类实例之间的隐式转换
我有一个类似这样的类:C++ 使用相互继承的类的模板化类实例之间的隐式转换,c++,oop,templates,inheritance,C++,Oop,Templates,Inheritance,我有一个类似这样的类: class Base { public: Base( int val = 0 ) : value( val ) {}; int value; }; 类A和B继承Base: class A : public Base {}; class B : public Base {}; 我还有一个模板类,其签名类似于: template < class T > class Temp { public:
class Base
{
public:
Base( int val = 0 ) : value( val ) {};
int value;
};
类A
和B
继承Base
:
class A : public Base {};
class B : public Base {};
我还有一个模板类,其签名类似于:
template < class T >
class Temp
{
public:
Temp ( const T & val = T() ) : m_T( val ) {};
T m_T;
};
显然,这不起作用,因为Temp
和Temp
不相关,并且类型之间没有隐式转换(即使A
和B
是Base
)
解决这个问题的方法有哪些?如有任何意见,将不胜感激
提前感谢您的帮助。模板
template<typename T, typename U>
void doSomething ( Temp< T > * a, Temp< U> * b )
{
(*a) = (*b);
};
无效剂量测定法(温度*a,温度*b)
{
(*a)=(*b);
};
模板
无效剂量测定法(温度*a,温度*b)
{
(*a)=(*b);
};
如果不小心,继承关系会失去很多用处,但如果从公共基类派生Temp,则可以在其派生类中创建模板成员。实际上,您最终要做的是将A和B的公共接口移动到BASE中,然后为了专门化(如何实际执行这些功能),您引用BASE中的TempA或TempB成员(A和B被括号包围。编辑器不会显式显示).如果不小心,继承关系会失去很多用处,但如果从公共基类派生Temp,则可以在其派生类中创建模板成员。实际上,您最终要做的是将A和B的公共接口移动到BASE中,然后为了专门化(如何实际执行这些功能),您引用BASE中的TempA或TempB成员(A和B被方括号包围。编辑器不会让我显式显示。)。Temp和Temp是完全不同的类型,不是吗?这难道不会使赋值行变得不可能吗?在编译时,编译器将使用指定的具体类型创建doSomething版本,然后尝试编译结果函数。在这种情况下,它将起作用,因为指定类型的U和T之间的赋值是有效的。@Visage我的问题更多的是关于临时*到临时*的可赋值性。在我看来,这可能与doSomething()无关。我错在哪里?谢谢。如果将类型分配给U&T时,Temp*可分配给Type*,那么它将编译。如果没有,就不会。所以,如果T&U是A&B,并且Temp*可分配给Temp*,那么一切都很好。@James,是的,在你的最后一句话中,你是在陈述我的问题。如果a是临时星,b是临时星,它们是否以这种方式兼容?这是不是因为一个A起点可以被分配一个B星,一个临时星可以被分配一个临时星?临时星和临时星是完全不同的类型,不是吗?这难道不会使赋值行变得不可能吗?在编译时,编译器将使用指定的具体类型创建doSomething版本,然后尝试编译结果函数。在这种情况下,它将起作用,因为指定类型的U和T之间的赋值是有效的。@Visage我的问题更多的是关于临时*到临时*的可赋值性。在我看来,这可能与doSomething()无关。我错在哪里?谢谢。如果将类型分配给U&T时,Temp*可分配给Type*,那么它将编译。如果没有,就不会。所以,如果T&U是A&B,并且Temp*可分配给Temp*,那么一切都很好。@James,是的,在你的最后一句话中,你是在陈述我的问题。如果a是临时星,b是临时星,它们是否以这种方式兼容?是不是因为一个启动可以被分配一个B星,一个临时星可以被分配一个临时星?不仅是<>代码> TEMP和void
main()
{
Temp<A> a;
Temp<B> b;
doSomething( &a, &b) ;
};
template<typename T, typename U>
void doSomething ( Temp< T > * a, Temp< U> * b )
{
(*a) = (*b);
};