Использование шаблонных классов и функций в общем объекте / DLL

Я работаю над справедливо значительно измеренным проектом, который охватывает многие общие библиотеки. У нас также есть значительная уверенность в STL, Повышении и наших собственных шаблонных классах и функциях. Много экспортируемых классов содержат шаблонных участников, и экспортируемые функции содержат шаблонные параметры.

Вот упрощенный пример того, как я делаю экспорт библиотеки:

#if defined(_MSC_VER) && defined(_DLL)
    //    Microsoft 
    #define EXPORT __declspec(dllexport)
    #define IMPORT __declspec(dllimport)
#elif defined(_GCC)
    //    GCC
    #define EXPORT __attribute__((visibility("default")))
    #define IMPORT
#else
    //    do nothing and hope for the best at link time
    #define EXPORT
    #define IMPORT
#endif

#ifdef _CORE_COMPILATION
#define PUBLIC_CORE EXPORT
#define EXTERNAL_CORE
#else
#define PUBLIC_CORE IMPORT
#define EXTERNAL_CORE extern
#endif

#include <deque>

//    force exporting of templates
EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>;
EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >;

class PUBLIC_CORE MyObject
{
private:
    std::deque<int> m_deque;
};

Так, моя проблема состоит в том, что, когда я компилирую в Visual Studio (и 2008 и 2010), я получаю соблюдающее предупреждение:

предупреждение C4251: 'станд.:: _Deque_val <_Ty, _Alloc>:: _Almap': класс 'станд.:: средство выделения <_Ty>' должно иметь dll-интерфейс, который будет использоваться клиентами класса 'станд.:: _Deque_val <_Ty, _Alloc>'

Который, кажется, подразумевает, что я не экспортировал std::allocator<int>, который я имею. И это не похоже на мой экспорт, является неправильным, с тех пор не включая

EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>;
EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >;

урожаи предупреждение:

предупреждение C4251: 'MyObject:: m_deque': класс 'станд.:: двухсторонняя очередь <_Ty>' должна иметь dll-интерфейс, который будет использоваться клиентами класса 'MyObject'

Единственная вещь, о которой я могу думать, состоит в том что _Ty предупреждение о std::allocator говорит о, так или иначе нет int, но я, может казаться, не нахожу признака, что это было бы иначе, с тех пор a std::deque<int> логически выделил бы с std::allocator<int>.

Приложение потребления может использовать класс очень хорошо, но у меня есть инстинктивное чувство, что это предупреждение не должно быть проигнорировано. При компиляции с g ++ в Linux, никакие ошибки не испускаются (хотя это не означает, что он работает правильно). G ++ автоматически выполнение чего-то, что не может сделать MSVC? Я был нацелен на GCC на Linux, LLVM на OSX и MSVC в Windows, но я мог потенциально переместиться в MinGW для разработки Windows, так отказ от MSVC не точно вне рассмотрения (если это оказывается слишком большим из неудобства).

6
задан Travis Gockel 21 January 2010 в 15:02
поделиться

1 ответ

Как вы можете знать, шаблоны в вашем экспортном файле на самом деле являются разрешением на заполнение того, что вы считаете необходимым «для компилятора».

Это означает, что если вы компилируете файл заголовка с компилятором A, он может создать совершенно другой DECE , чем компилятор B. Порядок некоторых членов может измениться, для одного или даже Фактический тип некоторых переменных элементов.

И это то, что компилятор предупреждает вас.

Редактировать: добавляет некоторые последствия к объяснению

, чтобы ваши общие библиотеки будут работать только вместе, только при компиляции одним и тем же компилятором. Если вы хотите, чтобы они работали вместе, вы можете либо убедиться, что весь клиентский код «видит» одинаковую декларацию (благодаря той же реализации STL), или отступить от добавления шаблонов на ваш API.

3
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: