dllexport是一个全内联课程?

时间:2012-11-18 13:08:48

标签: c++ visual-c++ dll dllexport

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

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,成员MyClass)中使用类型为Int2 point的对象,则会收到以下警告:

警告C4251:'MyClass :: point':类'Point2D'需要让dll接口供'MyClass'类客户端使用

但是,如果我将'{1}}放在'Point2D'的定义中,就像警告所示(这对我来说似乎很愚蠢,因为所有函数都是内联的,加上它是一个模板,see SO question),尝试在另一个项目中使用DLL时出现以下错误:

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

请注意,__declspec(dllexport)的定义在标题中给出,该标题对所有项目都可见。

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

2 个答案:

答案 0 :(得分:1)

Int2的{​​{1}}成员替换为MyClass成员以解决此问题。在Int2*构造函数中创建Int2实例,并在MyClass析构函数中删除。

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

答案 1 :(得分:0)

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