1

如何在 .cpp 文件中实现模板功能?

函数.h

class f{

    void f1();

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

函数.cpp

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

3 回答 3

3

以下应该工作。我修复了语法并从头文件中删除了 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);
}
于 2019-10-16T12:47:28.357 回答
2

简单地:

// function.cpp

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

但是看看为什么模板只能在头文件中实现?

于 2019-10-16T12:14:12.730 回答
2

如果你有模板方法,它的定义必须在模板被实例化的地方可见。这意味着在 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> &);

主文件

#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 中引入了模块。根本没有更多的头文件。

于 2019-10-16T12:54:54.657 回答