Реализация не шаблонного метода, определенного в шаблонном классе - PullRequest
10 голосов
/ 09 декабря 2011

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

template class<typename T>
void MyClass::myMethod()
{
   ...
}

илимогу ли я определить его в файле cpp как:

void MyClass::myMethod()
{
   ...
}

?

Спасибо.

Ответы [ 5 ]

9 голосов
/ 09 декабря 2011

Вам необходимо определить свой метод следующим образом:

template class<typename T>
void MyClass<T>::myMethod()
{
    // Method Body
}

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

5 голосов
/ 08 мая 2015

Ну, если метод не зависит от параметра шаблона, вы можете сделать это только с помощью наследования AFAIK.

Недостаток: больше кода + наследование

Потенциал: (много)генерируется меньше кода, в зависимости от того, какие части вашего кода на самом деле зависят от шаблона.В приведенном ниже примере метод NonDependentMethod сгенерирует только одну сборку, а DependentMethod сгенерирует столько же, сколько существует различных параметров шаблона (в данном случае только один, но создайте MyClass<float>, а у вас два и т. Д.).

#include <iostream>
using namespace std;

class MyClassBase
{
public:
    void NonDependentMethod();
};

template <class T> class MyClass : public MyClassBase
{
public:
    void DependentMethod(T param);
};

void MyClassBase::NonDependentMethod()
{
    cout << "NonDependentMethod << endl;
}

template<class T> void MyClass<T>::DependentMethod(T param)
{
    cout << "DependentMethod " << param << endl;
}

int main() {
    // your code goes here
    MyClass<int> cls;
    cls.NonDependentMethod();
    cls.DependentMethod(2);
    return 0;
}
4 голосов
/ 09 декабря 2011

Поместите его в заголовочный файл.

Функция-член по-прежнему является членом шаблона класса, и вам нужно написать:

template <typename T> void MyClass<T>::myMethod() { /* ... */ }

Как и для всех элементов шаблонафункции, это еще не настоящая функция;только генерирует реальную функцию, когда создается экземпляр класса.Таким образом, полные определения шаблона должны быть видны каждому, кто создает экземпляр шаблона, и обычный способ сделать это - поместить все в заголовок.и вы можете специализировать их: template <> void MyClass<int>::myMethod() { }.)

1 голос
/ 09 декабря 2011

Вам нужно сделать это следующим образом:

template class<typename T>
void MyClass<T>::myMethod()
{
   ...
}

Это не метод, основанный на шаблонах, это класс.

Вы можете иметь шаблонный метод в не шаблонном классе, не шаблонный метод в шаблонном классе (ваш случай) и шаблонный метод в шаблонном классе, и, конечно, не шаблонный метод в не шаблонном классе. шаблонный класс.

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

Вы должны определить это даже другим способом.Сам метод не может (напрямую) зависеть от параметра шаблона, но класс, к которому он принадлежит, определенно не делает, нет?Таким образом, метод косвенно зависит и от параметра шаблона:

template class<typename T>
void MyClass<T>::myMethod()
{  //       ^^^ -- note
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...