На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с Новым 2025 годом!

Всем удачи, успеха и благополучия!

msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Шаблоны и DLL
    В DLL определены две функции:

    ExpandedWrap disabled
      template <typename T>
      void __declspec( dllexport ) SerializeArray(T &aP, CArchive& ar)
      {
      ...
      }
       
      template <typename T>
      void __declspec( dllexport ) CopyArray(T &aP, T &aP2)
      {
      ...
      }

    В самой DLL обе функции работают без проблем. В программе, используещей эту DLL, работает только первая фунцкия, на вторую вылетает ошибка:
    error LNK2001: unresolved external symbol

    Подскажите, плиз, где ошибка?
      Ошибка в том, что для заданного типа первая функция инстанцирована в DLL (реально используется), а вторая нет.
        Обе функции реально используются (вызываются) в DLL. Пробовал менять тип:
        ExpandedWrap disabled
          template <typename T2>
          void __declspec( dllexport ) CopyArray(T2 &aP, T2 &aP2)
          {
          ...
          }

        - ничего не изменилось.
        Расскажи подробнее, что значит "инстанцирована"?
          это значит, что первую в длл ты где-то вызываешь с такими же параметрами шаблона, как и при вызове из длл.
          а вторую - нет.

          предположим, в длл ты где-то в нутрях делаешь такой вызов:
          ExpandedWrap disabled
            int val1 = 0;
            SerializeArray(val1, ar); // в длл создался код ф-ции, работающий с int
             
            short val2 = 0;
            SerializeArray(val2, ar); // в длл создался код ф-ции, работающий с short


          а в .ехе-шнике делаешь так:
          ExpandedWrap disabled
            int val1 = 0;
            SerializeArray(val1, ar); // вызывается код из длл для работы с int
             
            short val2 = 0;
            SerializeArray(val2, ar); // вызывается код из длл для работы с int
             
            char val2 = 0;
            SerializeArray(val2, ar); // а такого кода в длл нет  :blink: , потому что не проинициализированна ф-ция


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

            Ну, не знаю. По-разному пробовал. Вызывал в ЕХЕ и с теми же параметрами, что и в DLL...

            Цитата
            именно поэтому шаблонные ф-ции не экспортируют, а описывают прямо в заголовочном файле.

            Понятно, спасибо.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0513 ]   [ 16 queries used ]   [ Generated: 19.01.25, 13:08 GMT ]