Создание C ++ DLL: проблема инициализации статических переменных - PullRequest
0 голосов
/ 13 сентября 2011

Я пытаюсь создать DLL на C ++, которую я мог бы использовать в других проектах.Один из моих классов выглядит так:

MyClass.h:

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

template <typename T, typename C>
class MYDLL_API MyClass
{
    private:
      static C *variable;

    //...
};

MyClass.cpp:

#include "stdafx.h"
#include "MyClass.h"

template <typename T, typename C>
C *MyClass<T, C>::variable= NULL;

И когда я его компилирую, я получаю сообщение об ошибке LNK2001:неразрешенный внешний символ ... "для этой переменной.Этот код отлично работал до того, как я попытался создать DLL ...

Пожалуйста, помогите мне исправить это.

1 Ответ

1 голос
/ 13 сентября 2011

Вы не можете поместить шаблонный класс в DLL, так как это просто не будет работать таким образом: фактический код для класса генерируется компилятором, когда вы указываете фактические типы для шаблона (именно поэтому STL поставляется как исходный код).

Просто создайте файл .h и добавьте туда все реализации.В другом проекте включите его:

// MyClass.h
template <typename T, typename C>
class MyClass
{
    private:
       static C *variable;

    //...
};

template <typename T, typename C>
   C *MyClass<T, C>::variable= NULL;


// OtherProject.cpp
#include "MyClass.h"
// ...
MyClass<int, char> instance;  //...

Если вы точно знаете, какие типы будут использовать другие проекты, вы можете использовать явную реализацию, просто добавив что-то вроде:

// explicitly instantiate class
template class MyClass<int, char>;

вMyClass.cpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...