typedef шаблон по умолчанию с тем же именем - PullRequest
3 голосов
/ 11 августа 2011

Оригинальный вопрос: У меня есть тип template <typename CostType> struct Key, который я использую в другом классе UQueue, который также настроен на CostType.Я бы не хотел указывать Key<CostType> в этом классе.Я пытался typedef Key<CostType> Key, который не работал.Есть ли другой обходной путь?

Редактировать: Минимальный пример, который показал бы проблему (если бы она была), был бы такой:

template <typename T>
class C1 {
    T t;
};
template <typename T>
class C2 {
    typedef C1<T> C1;
    C1 c1;
};

Однако это работает ( с использованием MSVC 2010 ).У меня есть какая-то другая ошибка в моем коде, которая смутила меня, полагая, что определение типа является незаконным.Извините за пропускную способность.

1 Ответ

0 голосов
/ 27 декабря 2011

Используйте макрос. Я всегда так делаю, потому что это просто и легко поддерживать.

Возьми эту ситуацию:

template <typename A, size_t B, int C, pointer_to_some_func D> class tTemplate
{
     struct myStruct
     {
         int i, j;
     };

     void function1 (tTemplate <A, B, C, D> :: myStruct S);
     void function2 ();
};

template <typename A, size_t B, int C, pointer_to_some_func D> void tTemplate <A, B, C, D> :: function1 (tTemplate <A, B, C, D> :: myStruct S)
{  
}

и т.д ...

Представьте себе, если бы мне пришлось изменить аргумент или добавить еще один ...

Теперь с этим:

#define dTemplate tTemplate <A, B, C, D>
#define sTemplate template <typename A, size_t B, int C, pointer_to_some_func D>

sTemplate void dTemplate :: function1 (dTemplate::myStruct S)
{

}

Легче поддерживать, использовать другие классы \ шаблоны и т. Д. Изменение одного аргумента шаблона = изменение макроса, которое применяется везде. И это также приятнее для глаз. Кроме того, я нахожу это хорошим в шаблонах, тем более что typedefs не разрешены. И что самое лучшее в макросах, даже если IF typedefs были стандартом: вам не нужны предварительные объявления для них ... никогда! (да, макросы - это зло, но в подобных ситуациях они более чем полезны)

Что касается вашего примера:

#define dC1 C1 <T>       // no ";" !!!

template <typename T> class C1
{
    T t;
};

template <typename T> class C2
{
    dC1 c1;
};
...