Я знаю, что можно сделать шаблонную функцию:

template<typename T>
void DoSomeThing(T x){}

И можно сделать шаблонный класс:

template<typename T>
class Object
{
public:
    int x;
};

Но можно ли сделать класс вне шаблона, а затем сделать функцию в этом классе шаблоном? Т.е.:

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

Или что-то в той степени, где класс не является частью шаблона, а функция есть?

163
user98188 9 Июн 2009 в 23:50

4 ответа

Лучший ответ

Ваша догадка верна. Единственное, что вы должны помнить, это то, что шаблон функции-члена определение (в дополнение к объявлению) должен находиться в файле заголовка, а не в cpp, хотя он не должны быть в теле самого объявления класса.

127
Not Sure 9 Июн 2009 в 19:59

Самый простой способ - поместить объявление и определение в один и тот же файл, но это может привести к увеличению размера файла excutable. Например.

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

Также можно поместить определение шаблона в отдельные файлы, т.е. поместить их в файлы .cpp и .h. Все, что вам нужно сделать, это явно включить создание шаблона в файлы .cpp. Например.

// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);
16
hey 31 Июл 2018 в 06:16

Да, функции-члены шаблона совершенно законны и полезны во многих случаях.

Единственное предостережение: функции-члены шаблона не могут быть виртуальными.

22
Tobias 11 Июн 2009 в 18:10

См. Здесь: Шаблоны, методы шаблона, шаблоны элементов, шаблоны функций элементов

class   Vector
{
  int     array[3];

  template <class TVECTOR2> 
  void  eqAdd(TVECTOR2 v2);
};

template <class TVECTOR2>
void    Vector::eqAdd(TVECTOR2 a2)
{
  for (int i(0); i < 3; ++i) array[i] += a2[i];
}
70
Lothar 5 Ноя 2017 в 00:36