您尚未登录。

#1 2021-08-15 19:11:46

xQmQ
会员
注册时间: 2020-08-24
帖子: 43
个人网站

关于C++11中对类的模板函数实例化问题

include
  +--- thread-pool.h
src
  +--- thread-pool.cpp

现有一项目,在thread-pool.h声明有一个类,类中有一个返回类型推导的模板函数
测试

我在thread-pool.cpp中定义了类的构造函数等。唯独这个submitWork()定义在thread-pool.h文件中时,不论是类内定义还是类外定义都可以通过编译。但是在thread-pool.cpp中定义时会报错,这里应当是模板的声明定义分离问题。

我想请教一下,如何实现这个函数在thread-pool.cpp中定义?比如模板类实例化这种方法可不可以用在这里?可以的话应当如何对这个函数做实例化呢?

谢谢

离线

#2 2021-08-15 19:43:51

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 关于C++11中对类的模板函数实例化问题

你定义到 .cpp 文件里,用的地方根本找不到你这个模板啊。

离线

#3 2021-08-15 20:06:04

xQmQ
会员
注册时间: 2020-08-24
帖子: 43
个人网站

Re: 关于C++11中对类的模板函数实例化问题

依云 说:

你定义到 .cpp 文件里,用的地方根本找不到你这个模板啊。

是这个问题,因为不是模板类,所以直接写到.cpp里去了。但是写到这个模板函数的时候才反应过来有问题。
因为查过有一种方式是通过实例化模板类,来实现声明定义的分离,所以我想请教一下,能不能对这个模板函数实现实例化
(我不想直接放进.h里,想看看有没有其他解决方法

离线

#4 2021-08-16 09:48:50

nsqk11
会员
注册时间: 2020-08-04
帖子: 1

Re: 关于C++11中对类的模板函数实例化问题

我之前有过这样的处理经历,我认为的方法是这样的:在 .h文件类的申明之后include .cpp文件并且 .cpp文件中include .h文件,之后使用#ifdef、#define来解决重复include的问题

离线

#5 2021-08-16 10:50:02

xQmQ
会员
注册时间: 2020-08-24
帖子: 43
个人网站

Re: 关于C++11中对类的模板函数实例化问题

nsqk11 说:

我之前有过这样的处理经历,我认为的方法是这样的:在 .h文件类的申明之后include .cpp文件并且 .cpp文件中include .h文件,之后使用#ifdef、#define来解决重复include的问题

谢谢,我琢磨一下

离线

#6 2021-08-16 15:01:06

matrikslee
会员
注册时间: 2017-04-21
帖子: 442
个人网站

Re: 关于C++11中对类的模板函数实例化问题

xQmQ 说:

我想请教一下,如何实现这个函数在thread-pool.cpp中定义?比如模板类实例化这种方法可不可以用在这里?可以的话应当如何对这个函数做实例化呢?

谢谢

你这个需求就非常奇怪,我不知道你是怎么理解include头文件机制的

反正就是模板声明其实就是一段文本,写在头文件(.h)里面和源文件(.cpp)并没有本质区别,
只是写在头文件里面可以用include导出复制到处使用而已。

你手动复制保证这一段文本在不同的.cpp文件中是一样的,也可以实现到处使用的效果。

而且如果你不介意,并且代码也只是你自己一个人看,
你可以新建一个叫template.cpp的文件,然后在里面写template模板
在别的cpp文件中,要用到模板的地方来一句#include <template.cpp>也没问题

C/C++又没有规定#include指定只能对头文件使用,其实是可以对任何文件使用的,问题只在于include的文件是否存在,存在的话,完成include替换之后是否会编译错误而已。

离线

#7 2021-08-16 18:28:09

xQmQ
会员
注册时间: 2020-08-24
帖子: 43
个人网站

Re: 关于C++11中对类的模板函数实例化问题

matrikslee 说:

你这个需求就非常奇怪,我不知道你是怎么理解include头文件机制的

反正就是模板声明其实就是一段文本,写在头文件(.h)里面和源文件(.cpp)并没有本质区别,
只是写在头文件里面可以用include导出复制到处使用而已。

你手动复制保证这一段文本在不同的.cpp文件中是一样的,也可以实现到处使用的效果。

而且如果你不介意,并且代码也只是你自己一个人看,
你可以新建一个叫template.cpp的文件,然后在里面写template模板
在别的cpp文件中,要用到模板的地方来一句#include <template.cpp>也没问题

C/C++又没有规定#include指定只能对头文件使用,其实是可以对任何文件使用的,问题只在于include的文件是否存在,存在的话,完成include替换之后是否会编译错误而已。

因为个人习惯问题,对于非模板类我倾向于声明和定义分离到头文件和源文件里,这次也是头一次遇见定义了模板成员函数,所以才有了这个问题

关于c++头文件机制我也没有系统学习过,是平常看一些文章了解的。因为还没有实习和工作,没有这方面的经验,我更倾向于平时写代码尽可能向业界规范靠拢

关于你说的方式,我会试一下,谢谢

离线

页脚