c++ - 在类库项目 C++ 中创建模板类

标签 c++ templates class-library

我有一个其他 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 的方法。但是,编译器会看到 header 内的定义。

如何克服这种情况并能够导出在类库项目中定义的模板类?

最佳答案

未实例化的模板无法直接编译 - 它们是代码生成器,因此只有在实例化时它们才会真正转换为二进制指令;因此,您不能像“常规”函数/类一样导出“二进制形式”的模板(另一方面,至少在理论上您可以导出模板的实例化)。

长话短说:只需将模板保留在标题中即可由库客户端包含。

请注意,这就是您将模板保留在 header 中并且通常不会在 .cpp 文件中分离它们的实现的确切原因。

关于c++ - 在类库项目 C++ 中创建模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13705401/

相关文章:

c++ - 在 cmake 中包含 cmake 头文件 boost.hpp

c++ - 如何安装 c++ 库以便我可以使用它?

.net - 类库 (.dll) 应该从哪里读取其配置?

debugging - 如果库也在 GAC 中,Visual Studio 2012 将不会对其进行调试

c++ - `Too many initializers` 用于 RTEMS 驱动程序定义中的阵列设置

C++ 函数模板按值特化 (-1)

templates - latex :不同页边距不同

c++ - 删除警告 : "variable ' result' is used uninitialized whenever 'if' condition is false"in c++

c# - 如何在 Visual Studio 中调试类库

c++ - 点遍历的最佳数据结构