4

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

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;

当我想导出到 DLL 的Int2另一个类(例如 class MyClass、 member )中使用类型对象时,我收到以下警告:Int2 point

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

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

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

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

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

4

2 回答 2

1

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

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

于 2012-11-18T13:13:17.107 回答
0

尝试将__declspec(dllexport)/__declspec(dllimport)分别添加到每个内联方法。对于非模板类,这将是一个错误,但模板类/函数似乎也需要添加这个 per-method。

于 2017-09-09T12:04:04.610 回答