шаблонный метод на T в шаблонном классе на TT: это возможное/корректное

У меня есть класс MyClass, который является шаблонным на имени типа T. Но внутри, я хочу метод, который является шаблонным на другом типе TT (который не связан с T).

После чтения/лужения я нашел следующую нотацию:

template <typename T>
class MyClass
{
   public :
      template<typename TT>
      void MyMethod(const TT & param) ;
} ;

По стилистическим причинам (мне нравится иметь мое шаблонное объявление класса в одном заголовочном файле и определения метода в другом заголовочном файле), я не определю метод в объявлении класса. Так, я должен записать это как:

template <typename T>     // this is the type of the class
template <typename TT>    // this is the type of the method
void MyClass<T>::MyMethod(const TT & param)
{
   // etc.
}

Я знал, что должен был "объявить" имена типов, используемые в методе, но не знал как точно, и найденный через пробные версии и ошибки.

Код выше компиляций на Visual C++ 2008, но: действительно ли это - корректный способ обработать метод по шаблону на TT в классе, шаблонном на T?

В качестве награды: существуют ли скрытые проблемы/неожиданности/ограничения позади этого вида кода? (Я предполагаю, что специализации могут быть довольно забавны для записи),

7
задан paercebal 28 April 2010 в 12:52
поделиться

2 ответа

Это действительно правильный способ делать то, что вы хотите, и он будет работать на каждом достойном компиляторе C ++. Я тестировал его на gcc4.4 и последней версии clang.

За любым кодом скрываются проблемы / сюрпризы / ограничения.

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

3
ответ дан 7 December 2019 в 16:40
поделиться

Думаю, это нормально. Взгляните, например, на реализацию std :: vector. У вас есть вектор класса, который имеет несколько параметров шаблона (в первую очередь тип элемента), а внутри один из его конструкторов объявлен так же, как ваш метод. Он имеет InputIterator в качестве параметра шаблона. Так что я думаю, что это не такая уж редкость.

0
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: