Неявное преобразование между шаблонными экземплярами классов, которые используют классы, наследуемые друг от друга - PullRequest
1 голос
/ 20 августа 2010

У меня есть класс, который выглядит следующим образом:

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<Base> экземпляров и действует на них:

void doSomething ( Temp< Base > * a, Temp< Base > * b )
{
    (*a) = (*b);
};

В конечном счете, я быхотел бы, чтобы Temp<A> и Temp<B> экземпляры передавались в doSomething(), например:

void
main()
{
    Temp<A> a;
    Temp<B> b;
    doSomething( &a, &b) ;
};

Очевидно, это не будет работать, потому что Temp<A> и Temp<B> не связаны и не существует неявногопреобразование между типами (даже если A и B равны Base).

Как можно решить эту проблему?Будем благодарны за любые комментарии.

Заранее благодарим за помощь.

Ответы [ 2 ]

1 голос
/ 20 августа 2010
template<typename T, typename U>
void doSomething ( Temp< T > * a, Temp< U> * b ) 
{ 
    (*a) = (*b); 
}; 
0 голосов
/ 20 августа 2010

Вы теряете много полезности отношений наследования, если не будете осторожны, но если вы сделаете Temp производным от общего базового класса, вы можете создавать шаблонные члены в его производных классах.По сути, в конечном итоге вы перемещаете свой общий интерфейс A и B в BASE, а затем для специализации (как на самом деле выполнять эти функции) вы обращаетесь к члену TempA или TempB в BASE (где A и B окруженыскобки. Редактор не оставит меня в явном виде.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...