Вложенный класс, dllexport и VS2010 - PullRequest
       33

Вложенный класс, dllexport и VS2010

2 голосов
/ 04 октября 2011

Давайте получим следующий код:

template <typename T> struct X
{ X() { }
};

struct __declspec(dllexport) A
{ struct __declspec(dllexport) AB
  { int i;
  };

  typedef X <AB> XAB;

  //template struct __declspec(dllexport) X <AB>; // error C2252: an explicit instantiation of a template can only occur at namespace scope

  static XAB x; // warning C4251: 'A::x' : struct 'X<T>' needs to have dll-interface to be used by clients of struct 'A'
  static X <AB> x2; // warning C4251: 'A::x2' : struct 'X<T>' needs to have dll-interface to be used by clients of struct 'A'
  X <AB> x3; // warning C4251: 'A::x3' : struct 'X<T>' needs to have dll-interface to be used by clients of struct 'A'
};

template struct __declspec(dllexport) X <A::AB>; // Has no effect

Итак:

  • У меня есть класс для экспорта в DLL.
  • Этот класс имеетподкласс для экспорта в DLL тоже.
  • Существуют переменные ('x ...') типа template <subclass>.
  • Переменные-члены тоже необходимо экспортировать в dll.
  • Так что мне нужно явно создать экземпляр template <subclass> перед использованием этого типа.
  • Но это невозможно, поскольку создание экземпляров может быть выполнено только в глобальной области видимости.
  • Но в глобальной области видимости подкласс не определен (пока).

  • Создание экземпляра template <class::subclass> после тела класса не имеет никакого эффекта.

Так как правильно решить эту проблему, чтобы избежать предупреждений и ошибок?

Кстати: создание шаблона в классе хорошо работало в VS2008.

Спасибозаранее.

LuP

...