gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:27 36 4
gpt4 key购买 nike

我有一个 C++ 类库项目,其他 C++ 项目通常使用它。为了能够在我的类库项目中使用类,我编写了一个头文件,如下面给出的示例

#pragma once
#ifdef MYLIB
# define MYLIB_EXPORT __declspec(dllexport)
#else
# define MYLIB_EXPORT __declspec(dllimport)
#endif

没问题,直到我想在我的类库项目中创建一个模板类。问题是我无法导出我的模板类。

我的类.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 中以供图书馆客户包含。

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

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

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com