Как использовать обходной путь шаблона typedef в объявлении функции? - PullRequest
7 голосов
/ 22 марта 2012

Я хотел бы использовать шаблонную typedef в разных местах, среди прочего, в объявлении функции с собственной шаблонной функцией. Вот моя текущая попытка

template<typename T>
struct type{ typedef std::vector<T> sometype; }

template<typename TT>
void someFunction( type<TT>::sometype& myArg );

(Обратите внимание, что std::vector<T> является просто примером). Это не работает и выдает ошибку компилятора "объявление шаблона 'void someFunction'". Я уже понял, что мне нужно поставить typename перед type<TT>, т.е.

template<typename TT>
void someFunction( typename type<TT>::sometype& myArg );

работает. Но это решение - по меньшей мере - немного громоздкое. Есть ли альтернативы?

1 Ответ

6 голосов
/ 22 марта 2012

Это не только громоздко, но и предотвращает вывод параметров шаблона:

std::vector<int> a;
someFunction(a); // error, cannot deduce 'TT'
someFunction<int>(a);

Альтернатива (в C ++ 11) - псевдонимы шаблона:

template<typename T>
using sometype = std::vector<T>;

template<typename T>
void someFunction(sometype<T> &myArg );

std::vector<int> a;
someFunction(a);

Вы также можетеиспользуйте макрос, за исключением того, что макросы никогда не являются правильным ответом.

#define sometype(T) std::vector<T>

template<typename T>
void someFunction( sometype(T) &myArg);

Кроме того, я считаю, что ваше определение sometype недопустимо до C ++ 11.У него не должно быть такого типа:

template<typename T>
struct type{ typedef std::vector<T> sometype; };

Я думаю, что C ++ 11 меняет правило, чтобы разрешить его, но некоторые компиляторы C ++ 03 не смогли правильно диагностировать проблему.

...