gpt4 book ai didi

c++ - dllexport 一个全内联类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:53 48 4
gpt4 key购买 nike

考虑一个简单的类,它只包含内联成员函数。例如:

template <typename T1, typename T2>
class Point2D {
public:
typedef Point2D<T1,T2> ThisType;
typedef T1 Tx;
typedef T2 Ty;
T1 x;
T2 y;
inline Point2D() : x(0), y(0) {}
inline Point2D(T1 nx, T2 ny) : x(nx), y(ny) {}
inline Point2D(const Point2D& b) : x(b.x), y(b.y) {}
inline Point2D& operator=(const Point2D& b) { x=b.x; y=b.y; return *this; }
inline ~Point2D() {}
};

typedef Point2D<int,int> Int2;

当类型为 Int2 的对象在我要导出的另一个类(例如,类 MyClass,成员 Int2 point)中使用时到 DLL,我收到以下警告:

警告 C4251:“MyClass::point”:类“Point2D”需要有 dll 接口(interface)才能由类“MyClass”的客户端使用

但是,如果我按照警告建议将 __declspec(dllexport) 放入“Point2D”的定义中(这对我来说似乎很愚蠢,因为所有函数都是内联的,而且它是一个模板,see SO question ), 尝试在另一个项目中使用 DLL 时出现以下错误:

错误 LNK2019:未解析的外部符号“__declspec(dllimport) public:__thiscall lwin::Point2D::Point2D(int,int)”...

请注意,Point2D 的定义在所有项目可见的 header 中给出。

我该怎么办?跳过 dllexport 并忽略警告?或者是否有一些巧妙的技巧可以避免这种编译器混淆?

最佳答案

Int2*成员替换MyClassInt2成员来解决这个问题。在 MyClass 构造函数中创建 Int2 实例并在 MyClass 析构函数中删除。

模板化类无法导出,因此您不能将其声明为__declspec(dllexport)。显示 C4251,因为容器类大小可能不同,如果 Dll 及其客户端使用不同的编译选项编译,这会导致未定义的行为。另一方面,指针的大小始终相同。

关于c++ - dllexport 一个全内联类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440390/

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