Зависящий от класса c ++ typedef объявлен вне класса

У меня есть два класса, которые я назову classA и classB.

В classA я определил несколько типов, например T5.
В classB я использую такие типы, которые определены в classA.

Во избежание написания

typename classA<T1,T2>::T5

В моем коде я хочу создать независимый от класса тип, который я мог бы вызвать напрямую по его имени - templatedClassA в примере. Параметры шаблона по-прежнему будут параметрическими, и я буду определять их в будущих проектах, используя classA и classB.

#include <cstdlib>
#include <iostream>

using namespace std;

//classA
template <class T1, class T2>
class classA
{
 public:  
 typedef T1 T5;
 classA();
};

template <class T1, class T2>
classA<T1,T2>::classA(){}
//end classA

template <class T1, class T2>
typedef classA<T1,T2> templatedClassA;

template <class T1, class T2>
typedef typename classA<T1,T2>::T5 T6;






//classB
template <class T3, class T4>
class classB
{
 public:
 classB();
};

template <class T3, class T4>
classB<T3,T4>::classB(){}
//end classB



int main(int argc, char *argv[])
{

    classB<int, double> classBInstance;

    system("PAUSE");
    return EXIT_SUCCESS;
}

При компиляции приведенного выше кода я получаю две следующие ошибки:

template declaration of `typedef class classA<T1, T2> templatedClassA'
template declaration of `typedef typename classA<T1, T2>::T5 T6'.

Что я делаю неправильно?


person geraldCelente    schedule 04.05.2014    source источник


Ответы (2)


Шаблоны нельзя использовать в typedef объявлениях. Вы должны заключить объявление в такой класс:

template <class T1, class T2>
class templatedClassA {
    typedef classA<T1, T2> type;
};

template <class T1, class T2>
class T6 {
   typedef typename classA<T1, T2>::T5 type;
};

В С ++ 11 вы можете использовать псевдоним using, как показано в другом ответе.

person 0x499602D2    schedule 04.05.2014
comment
Хорошо, спасибо за ответ. Проблема, которую я вижу с templatedClassA ‹T1, T1› :: type и T6 ‹T1, T2› :: type, заключается в том, что он такой же, как classA ‹T1, T2› и class ‹T1, T2› :: T5; Нотация не сочувствует, как я хочу, утяжеляю, думаю ... - person geraldCelente; 04.05.2014
comment
@geraldCelente: T5 зависит только от первого аргумента шаблона? - person kec; 04.05.2014
comment
Ну нет, в реальном коде нет. Это зависит от множества других классов и внутренних типов. - person geraldCelente; 04.05.2014
comment
Хм ... но из того, что вы написали выше, похоже, вы говорите, что templatedClassA ‹T1, T2› :: type не зависит от T2. В этом случае вы можете просто удалить второй параметр шаблона из templatedClassA. - person kec; 04.05.2014
comment
@geraldCelente Я полагаю, вы можете использовать наследование, как в template<typename T1, typename T2> struct T5 : classA<T1, T2> { }; - person 0x499602D2; 04.05.2014

В C ++ 11 вы можете:

template <class T1, class T2>
using templatedClassA = classA<T1, T2>;

template <class T1, class T2>
using T6 = typename classA<T1, T2>::T5;
person Jarod42    schedule 04.05.2014
comment
Хорошо, спасибо за ответ. Извините, я забыл упомянуть, что работаю над c ++ '98. - person geraldCelente; 04.05.2014