2015-02-04 4 views
0

Я знаю, как наследовать классы с шаблонами в целом. Но когда дело доходит до вложенных классов/шаблонов, я понятия не имею и не могу найти что-либо в Интернете (возможно, потому, что я не знаю ключевых слов для него).C++: класс Inherit с шаблонами

template <typename T> 
class A; 

template <class T1, class T2> 
class B; 

template < typename T1, class T2, class T3 > 
class C2: 
    public C< A<T1>, B<T2, T3> > 
{}; 

Я хочу C2 быть определен таким же образом C определена, т.е. C2< A<T1>, B<T2, T3> > и не C2<T1, T2, T3>. Но я не знаю никакого синтаксиса или обходного пути, как этого добиться.

Редактировать: T.C. правильно, я хочу, чтобы конечный пользователь написал только C2< A<T1>, B<T2, T3> > foo;, C2<foo, bar> foo; не должен быть разрешен.

+4

Я несколько раз прочитал ваш вопрос, и я не получить то, что вы просите. Прежде всего: как определяется 'C'? –

+0

Вы хотите, чтобы конечный пользователь написал 'C2 < A, B > foo;' а не 'C2 foo;'? Что должно произойти, если они пишут 'C2 foo;'? –

+2

'template <класс, класс> класс C2;/* undefined */template <класс T1, класс T2, класс T3> класс C2 , B >: public C < A, B > {/ * definition * /}; ' –

ответ

3

Это работает для меня:

template <typename T> 
class A {}; 

template <class T1, class T2> 
class B {}; 

template < typename T1, class T2> 
class C {}; 

// forward declare C2 but don't define it.  
template < typename T1, class T2 > class C2; 

// Create the only specialization that depends on using A and B. 
template < typename T1, class T2, class T3 > 
class C2<A<T1>, B<T2, T3> >: public C< A<T1>, B<T2, T3> > 
{}; 

int main() 
{ 
    C2<A<int>, B<double, float>> c1; // OK. 
            // This creates an instance of the 
            // only specialization that has 
            // been defined. 

    C2<int, double> c2;    // Not OK. 
            // The generic template class has 
            // been forward declared but has not 
            // not been defined. 
} 
+0

Это действительно так, как вы говорите, но, пожалуйста, объясните, почему это работает. Для первого взгляда это даже не показалось мне для меня ... –

+0

@ GáborAngyal, см. Обновленный ответ. Упование дополнительных комментариев делает его более ясным. –

+0

Ох. Итак, это шаблон, специализирующийся на шаблоне. Очень умно! –

Смежные вопросы