Рассмотрим простой класс, который состоит только из встроенных функций-членов. Например:
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-интерфейс для использования клиентами класса 'MyClass'
Однако, если я добавлю __declspec(dllexport)
в определение Point2D, как предлагает предупреждение (что мне кажется глупым, поскольку все функции встроены, плюс это шаблон, см. Вопрос SO), я получаю следующую ошибку при попытке использовать DLL в другом проекте:
ошибка LNK2019: неразрешенный внешний символ «__declspec (dllimport) public: __thiscall lwin :: Point2D :: Point2D (int, int)» ...
Обратите внимание, что определение Point2D
дается в заголовке, который виден для всех проектов.
Что я должен делать? Пропустить dllexport
и игнорировать предупреждение? Или есть какой-нибудь хитрый трюк, который поможет избежать путаницы с компилятором?