У меня есть класс 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?
В качестве награды: существуют ли скрытые проблемы/неожиданности/ограничения позади этого вида кода? (Я предполагаю, что специализации могут быть довольно забавны для записи),
Это действительно правильный способ делать то, что вы хотите, и он будет работать на каждом достойном компиляторе C ++. Я тестировал его на gcc4.4 и последней версии clang.
За любым кодом скрываются проблемы / сюрпризы / ограничения.
Основная проблема, с которой вы в конечном итоге можете столкнуться с этим кодом, заключается в том, что вы не можете сделать шаблонную функцию виртуальной, поэтому, если вы хотите получить полиморфизм на уровне класса для своей шаблонной функции, вы не реализуете ее с помощью внешняя функция.
Думаю, это нормально. Взгляните, например, на реализацию std :: vector. У вас есть вектор класса, который имеет несколько параметров шаблона (в первую очередь тип элемента), а внутри один из его конструкторов объявлен так же, как ваш метод. Он имеет InputIterator в качестве параметра шаблона. Так что я думаю, что это не такая уж редкость.