явное создание шаблона функции-члена в классе - PullRequest
1 голос
/ 26 июня 2019

У меня есть класс, который содержит метод шаблона, объявленный в заголовке следующим образом:

Class MyClass {
public :
   template <class T>
   int memberFunction(T& arg);
}

шаблон функции определяется в .cpp следующим образом:

template<class T> int MyClass::memberFunction(T& arg){
    return arg*arg + arg + 0.2;
}

исоздается в файле cpp следующим образом:

template
int MyClass::memberFunction<int>(int&);

template
int MyClass::memberFunction<double>(double&);

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

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Вы можете предоставить явное объявление экземпляра в заголовке:

Class MyClass {
public :
   template <class T>
   int memberFunction(T& arg);
};

extern template
int MyClass::memberFunction<int>(int&);

extern template
int MyClass::memberFunction<double>(double&);

Этого явного заявления о создании экземпляра, хотя здесь оно и не требуется, может быть достаточно, чтобы успокоить MSVC.

1 голос
/ 26 июня 2019

Вы можете определить шаблон функции в заголовке, чтобы избежать предупреждений компоновщика, что-то вроде этого, в myclass.h

class MyClass {
public :
   template <class T>
   T memberFunction(const T& arg) {
       return arg*arg + arg + 0.2;
   }
};

Обратите внимание на изменение в объявлении функции-члена шаблона.Вам не нужно разделять объявление и определение, а также явно определять специализацию для типов int и double, потому что поведение вашей функции одинаково для int и double.Помните о возможном взлете кода.Позже вы можете использовать функцию, как показано ниже

#include "myclass.h"
int main(int argc, char** argv) {

MyClass c1;
int res = c1.memberFunction(3);
printf("result=%d",res);
return 0;
}

, и позволить компилятору выводить тип аргументов и неявно производить надлежащую реализацию функции.Если вам действительно нужен ant int для возврата из функции, вы можете сделать несколько приведений к результату.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...