c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库))

2024-05-27 21:48

本文主要是介绍c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考https://blog.csdn.net/mincheat/article/details/77987740
一般情况,模板函数被外部其他引用会提示找不到函数,原因是:
编译本身这个cpp的时候,没有发现有引用的地方,那么就不会被编译,而编译引用这个模板函数的其他cpp的时候,要直接调用这个函数,就会发现这个函数没有编译,没有实现,所以报错,找不到该函数。

解决方法:在cpp文件中进行显示指定类型的模板实例化。

适用场景:希望对外声明提供的头文件简单并隐藏实现。

动态库VS2017demo:

templateTest.h:

#pragma once#include <iostream>using namespace std;#ifdef TEST_EXPORT_API
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#pragma comment(lib, "templateTest.lib")
#endifclass TEST_API templateTest
{
public:template<class T>void publicFunc(T arg){cout << "publicFunc" << arg << endl;}template<class... T>void privateFunc(const T&... args);void test();
};

templateTest.cpp:

#include "templateTest.h"// <类型>(参数修饰):<T>(const T&)、<T>(const T)、<T>(const T*)
template void TEST_API templateTest::privateFunc<int>(const int&);
//  显示实例化可变参数中无参数的情况:
template void TEST_API templateTest::privateFunc<>();template<class... T>
void templateTest::privateFunc(const T& ...args)
{cout << "privateFunc" << endl;
}void templateTest::test()
{privateFunc(5);
}

main.cpp:

#include <iostream>
#include "templateTest.h"using namespace std;int main()
{templateTest temp;temp.privateFunc(5);getchar();}

以上是在msvc中使用动态库中的模板函数中的方法。在gcc中更简单了,只需要:

#define TEST_API

在windows中使用动态库,如果不用__declspec(dllexport)导出 __declspec(dllimport)导入,则模板函数会提示找不到

这篇关于c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008686

相关文章

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S