Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用相互继承的类的模板化类实例之间的隐式转换_C++_Oop_Templates_Inheritance - Fatal编程技术网

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和 TEMP不相关,你不能将一个C++的实例指定为<代码> A<代码>。我猜我的问题归结为,在C++中,为什么一篮苹果不是一篮水果?我怎么能不费吹灰之力就解决这个问题呢?一篮苹果是一篮水果,但你正在讨论的机制(模板)不是一篮水果;它是一个全新的实体,编译器不能分辨它是一个篮子、一个袋子或一架飞机。不仅是代码> TEMP和 TEMP无关,你不能将一个实例的代码< B/COD>分配给一个实例<<代码> A/COM>。我猜我的问题归结为,在C++中,为什么一篮苹果不是一篮水果?我怎么能不费吹灰之力就解决这个问题呢?一篮苹果是一篮水果,但你正在讨论的机制(模板)不是一篮水果;这是一个全新的实体,编译器无法分辨它是篮子、包还是飞机。
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); 
};