在类库项目中创建模板类C++
Creating template classes in a Class Library project C++
我有一个C++类库项目,通常被其他C++项目使用。为了能够在我的类库项目中使用类,我编写了一个头文件,如下所示的示例
#pragma once
#ifdef MYLIB
# define MYLIB_EXPORT __declspec(dllexport)
#else
# define MYLIB_EXPORT __declspec(dllimport)
#endif
没问题,直到我想在我的类库项目中创建一个模板类。问题是我无法导出模板类。
MyClass.h
template<class T>
class MYLIB_EXPORT MyClass
{
void myMethod();
// ...
}
template<class T>
void MyClass::myMethod()
{
// ...
}
在这种情况下,我收到编译错误,说"不允许定义dllimport函数"。我知道是什么导致了问题,我理解它。使用我的类库项目的其他项目将 MYLIB_EXPORT 关键字转换为 __declspec(dllimport)。因此,他们期望在 DLL 中定义 MyClass 的方法。但是,编译器随后会看到标头中的定义。
如何克服这种情况并能够导出在类库项目中定义的模板类?
未实例化的模板不能直接编译 - 它们是代码生成器,因此它们实际上只有在实例化时才被转换为二进制指令;因此,您不能"以二进制形式"导出模板,就好像它是"常规"函数/类一样(另一方面,至少在理论上您可以导出模板的实例化)。
长话短说:只需将模板保留在标题中即可由库客户端包含。
请注意,这就是将模板保留在标头中的确切原因,并且通常不会将它们的实现分离到.cpp
文件中。
只需删除模板类上的 语句即可。然后,您可以在类外部定义类函数(但仍在MYLIB_EXPORT
*.h
或*.hpp
头文件中)。
MyClass.h
template <typename T>
class MyClass // MYLIB_EXPORT removed
{
void myMethod();
// ...
};
template <typename T>
void MyClass<T>::myMethod()
{
// ...
}
我遇到了这个问题。很长一段时间后,我意识到删除MYLIB_EXPORT修复了它。希望这个答案能为其他人节省时间:-)
相关文章:
- 满意和建模的概念?
- 动态车辆建模和仿真启动条件
- 将矩阵建模为单个统一缓冲区对象
- 列明智的建模在音乐会技术中 - 列生成
- 如何查询类型是否建模结构
- 将其建模为BFS背后的直觉
- Systemc传输级建模从TLM_Generic_Payload提取两个整数
- 如何在Caffe中对复发性卷积神经网络进行建模
- 对火箭C 的速度和高度进行建模
- 范围 v3 和 view_facade,无法对 ForwardRange 进行建模
- 我应该使用什么数据结构来对数据库/表进行建模
- 在具有可替换阶段的C++中建模管道
- 应用程序的建模.何时使用哪个图表
- 无法编译 T1 架构和仿真建模工具
- 在内存中对微型计算机寄存器进行建模
- 如何使用本机C 在WinRT中创建模态消息框
- 使用"for"对"if"进行建模
- 如何在小型聊天应用程序中为数据库存储的用户事务建模
- C++ 对动态对象板进行建模
- 如何在OOP中为双向类建模