Как реализовать шаблонную функцию, которая принадлежит не шаблонному классу в .cpp - PullRequest
0 голосов
/ 16 октября 2019

Как я могу реализовать функцию шаблона в файле .cpp?

function.h

class f{

    void f1();

    template<typename T>
    void f3(std::vector<T> &){  
     //Implementation
    }
}

function.cpp

void f::f1(){ 
//code
}

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

Следующее должно работать. Я исправил синтаксис и удалил определение f3 из заголовочного файла. Кроме того, по умолчанию спецификатор доступа class равен private, поэтому доступ к f3(std::vector<T>&) из main будет недопустимым. См. Также ответ Jarod42 о реализации шаблонов в заголовке.

//function.h
#include <vector>

class F {
public:
  void f1();

  template<typename T>
  void f3(std::vector<T> &);
};

#include "function.tpp"

//function.tpp
template<typename T>
void F::f3(std::vector<T> &){  
 //Implementation
}

//main.cc
int main() {
  std::vector<int> v;
  F f;
  f.f3(v);
}
2 голосов
/ 16 октября 2019

Просто:

// function.cpp

template<typename T>
void f::f3(std::vector<T> &){  
 //Implementation
}

Но см. Почему шаблоны могут быть реализованы только в заголовочном файле?

1 голос
/ 16 октября 2019

Если у вас есть метод шаблона, его определение должно быть видно в том месте, где создается шаблон. Это означает, что в 99% случаев определение шаблона должно быть в заголовочном файле.

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

foo.h

#include <vector>

class f{
public:
    void f1();
    template<typename T>
    void f3(std::vector<T> &);
};

foo.cpp

#include "foo.h"
#include <iostream>

#define LOG std::cout << __PRETTY_FUNCTION__ << '\n'

void f::f1()
{
    LOG;
}

template<typename T>
void f::f3(std::vector<T> &)
{  
    LOG;
}

template void f::f3<int>(std::vector<int> &);
template void f::f3<double>(std::vector<double> &);

main.cpp

#include "foo.h"
#include <iostream>

int main()
{
    std::vector<int> bar{ 1, 3, 5, 6 };

    f foo;
    foo.f1();
    foo.f3(bar);

    return 0;
}

Демонстрационная версия

Обратите внимание, что в C ++ появится новая функция. В C ++ введены 20 модулей . Просто больше нет заголовочных файлов.

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