DLL-Экспорт статических членов базового класса шаблона

В DLL у меня есть экспортированный не шаблонный класс с базовым классом шаблона. Базовый класс шаблона s имеет статическую переменную-член. Я использую статический базовый член в исполняемом файле, который ссылается на DLL с экспортируемым нешаблонным классом.

Во многих случаях я получаю неразрешенные внешние символы или жалобы на непоследовательную связь. Я нашел один сценарий, который работает, но он кажется беспорядочным, поэтому мне интересно, есть ли лучший способ и может ли этот лучший способ также указывать на недостатки в компиляторе / компоновщике C ++ VS2010 SP1.

Это минимальный сценарий DLL, который я мог бы выделить - я не думаю, что смогу удалить что-либо здесь, не нарушая сценарий.

// Header file
template<typename T>
class _MYDLL_EXPORTS TBaseClass
  {
  public:
    static const double g_initial_value;
  };

class _MYDLL_EXPORTS MyClass : public TBaseClass<MyClass>
  {    
  };

// Kludge: use this code only when building the DLL, not when including
// from the DLL's client
#ifdef _MYDLL
  template<typename T>
  const double TBaseClass<T>::g_initial_value = 1e-5;
#endif


// CPP file
#include "header.h"
// Explicit instantiation of the template for the correct parameter.
template class TBaseClass<MyClass>;

Тогда пользователь DLL

#include <header.h>  
#include <iostream>
int main(void) {
 MyClass c;
 std::cout << c.g_initial_value;
return 0;
}
9
задан Joris Timmermans 21 October 2011 в 00:40
поделиться