Экспорт экземпляра класса библиотеки стандартных шаблонов (STL) и класс, который содержит элемент данных, который является объектом STL

Переводы статьи Переводы статьи
Код статьи: 168958 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье рассматривается выполнение следующих задач:
  • Экспорт экземпляра класса стандартного шаблона Library(STL).
  • Экспортируйте класс, содержащий элемент данных, который является STLobject.
Обратите внимание, что не может экспортировать общий шаблон. Должен быть создан шаблон; все параметры шаблона должен быть указан и должен быть полностью определенные типы, в момент создания экземпляра. Для<int>; экземпляр «стопку» создает экземпляр класса стека STL. Создание экземпляра приводит все члены класса стек<int> создаваемых.</int> </int>

Обратите внимание на то, что некоторых контейнеров STL (карты, набор, очередь, список, deque) не может быть экспортирован. Пожалуйста, обратитесь к разделу подробнее следовать подробное описание.

Дополнительная информация

Начиная с Visual C++ версии 5.0, можно принудительно экземпляра класса шаблона и экспорт при создании экземпляра. Чтобы экспортировать создание экземпляра класса шаблона, используйте следующий синтаксис:

Чтобы экспортировать класс STL

  1. В библиотеки DLL и файл .exe свяжите с одной DLLversion C во время выполнения. Либо связать с библиотекой Msvcrt.lib (построения выпуска) orlink как с Msvcrtd.lib (отладочное построение).
  2. В библиотеке DLL обеспечивают описатель __declspec в объявлении экземпляра thetemplate для создания экземпляра класса STL Экспорт из библиотеки DLL.
  3. В файле .exe предоставляют extern и __declspecspecifiers в объявлении шаблона при создании экземпляра, чтобы импортировать класс из библиотеки DLL. Это приводит к выдаче предупреждения C4231 "нестандартное расширение:" явное создание экземпляра шаблона extern'before.» Это предупреждение можно игнорировать.

Чтобы экспортировать класс, содержащий член данных, которое является объектом STL

  1. В библиотеки DLL и файл .exe свяжите с одной DLLversion C во время выполнения. Либо связать с библиотекой Msvcrt.lib (построения выпуска) orlink как с Msvcrtd.lib (отладочное построение).
  2. В библиотеке DLL обеспечивают описатель __declspec в объявлении экземпляра thetemplate для создания экземпляра класса STL Экспорт из библиотеки DLL.

    ПРИМЕЧАНИЕ. Не пропустите шаг 2; При создании экземпляра класса theSTL, который можно использовать для создания элементов данных необходимо экспортировать.
  3. В библиотеке DLL обеспечивают описатель __declspec thedeclaration класса, чтобы экспортировать класс из библиотеки DLL.
  4. В файле .exe предоставьте описатель __declspec thedeclaration класса, чтобы импортировать класс из библиотеки DLL.

    При экспорте theclass имеет один или несколько базовых классов, то необходимо экспортировать, а также thebase классы. Если при экспорте класса содержит данные ожидаемого члены типа класса, необходимо экспортировать классы также очень члены данных.
ПРИМЕЧАНИЕ. Некоторые классы STL используют другие классы библиотеки STL. Также можно экспортировать эти другие классы. Классы, которые должны быть экспортированы перечислены в предупреждения компилятора при компиляции с уровня предупреждения, меньше 1; то есть, /W2, /W3 или /W4. Уровень предупреждений 4 создает много предупреждений для заголовков STL и в настоящее время по этой причине не рекомендуется.

Некоторые классы STL содержат вложенные классы. Эти классы не могут быть экспортированы. Например deque содержит deque::iterator вложенного класса. При экспорте deque, вы получите предупреждение, что необходимо экспортировать deque::iterator. При экспорте deque::iterator вы получаете предупреждение, что необходимо экспортировать deque. Это вызвано разработанные ограничение, что после создания экземпляра класса шаблона его можно не заново создан и экспортирован. Только контейнера STL, который может быть экспортирован в настоящее время является вектор. Другие контейнеры (то есть карты, набор, очередь, список, deque) содержат вложенные классы и не может быть экспортирован.

При экспорте контейнер STL, параметризованные с определяемого пользователем типа (UDT), необходимо определить операторы < and="=" for="" your="" udt.="" for="" example,="" if="" you="" export=""> </> <MyClass>, необходимо определить MyClass::operator< and="" myclass="" operator="=." this="" is="" because="" all="" stl="" container="" classes="" have="" member="" comparison="" operators="" that="" require="" the="" existence="" of="" the="" operators="">< and="=" for="" the="" contained="" type.="" normally,="" these="" are="" not="" instantiated="" because="" they="" are="" not="" used.="" when="" you="" instantiate="" an="" instance="" of="" a="" template="" class,="" all="" member="" functions="" are="" generated.="" because="" the="" stl="" container="" classes="" have="" member="" functions="" that="" use="" the="" operators="">< and="=" for="" the="" contained="" type,="" you="" must="" implement="" them.="" if="" comparing="" objects="" of="" your="" udt="" does="" not="" make="" sense,="" you="" can="" define="" the="" comparison="" operators="" to="" simply="" return="" "true."="">

При _DLL символ определен во время компиляции (этот символ определен неявно, при компиляции с помощью параметра /MD или/MDd для связывания с DLL-версии среды выполнения C), следующие классы STL и различные глобальные операторы и функции, действующие на эти классы, уже экспортированные библиотекой времени выполнения C. Таким образом их нельзя экспортировать из библиотеки DLL. Это не должны быть причиной проблемы, импортирующий класс при условии, что он также использует версию библиотеки DLL во время выполнения C исполняемой программы: </MyClass>
Header      STL template class
------------------------------
<IOSFWD>    basic_ios
<IOSFWD>    <IOSFWD>
<IOSFWD>    basic_istream
<IOSFWD>    basic_string (also typedef'd as string and wstring)
<IOSFWD>    complex
<LOCALE>    messages
<XLOCALE>   codecvt
<XLOCALE>   ctype
<XLOCMON>   moneypunct
<XLOCMON>   money_get
<XLOCMON>   money_put
<XLOCNUM>   numpunct
<XLOCTIME>  time_get
<XLOCTIME>  time_put
<XSTRING>   basic_string (also typedef'd as string and wstring)
				
Подробнее о какие параметры шаблона используются и какие глобальные функции и Операторы объявляются можно найти соответствующий заголовочный файл.

Пример кода

   // -------------------------------------------
   // MYHEADER.H
   //disable warnings on 255 char debug symbols
    #pragma warning (disable : 4786)
   //disable warnings on extern before template instantiation
    #pragma warning (disable : 4231)

    #include <vector>

    // Provide the storage class specifier (extern for an .exe file, null
    // for DLL) and the __declspec specifier (dllimport for .an .exe file,
    // dllexport for DLL).
    // You must define EXP_STL when compiling the DLL.
    // You can now use this header file in both the .exe file and DLL - a
    // much safer means of using common declarations than two different
    // header files.
    #ifdef EXP_STL
    #    define DECLSPECIFIER __declspec(dllexport)
    #    define EXPIMP_TEMPLATE
    #else
    #    define DECLSPECIFIER __declspec(dllimport)
    #    define EXPIMP_TEMPLATE extern
    #endif

    // Instantiate classes vector<int> and vector<char>
    // This does not create an object. It only forces the generation of all
    // of the members of classes vector<int> and vector<char>. It exports
    // them from the DLL and imports them into the .exe file.
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<int>;
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<char>;

    // Declare/Define a class that contains both a static and non-static
    // data member of an STL object.
    // Note that the two template instantiations above are required for
    // the data members to be accessible. If the instantiations above are
    // omitted, you may experience an access violation.
    // Note that since you are exporting a vector of MyClass, you must
    // provide implementations for the operator < and the operator ==.
    class DECLSPECIFIER MyClass
    {
    public:
        std::vector<int> VectorOfInts;
        static std::vector<char> StaticVectorOfChars;

    public:
        bool operator < (const MyClass > c) const
        {
            return VectorOfInts < c. VectorOfInts;
        }
        bool operator == (const MyClass > c) const
        {
            return VectorOfInts == c. VectorOfInts;
        }
    };

    // Instantiate the class vector<MyClass>
    // This does not create an object. It only forces the generation of
    // all of the members of the class vector<MyClass>. It exports them
    // from the DLL and imports them into the .exe file.
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<MyClass>;

    // -------------------------------------------
    // Compile options needed: /GX /LDd /MDd /D"EXP_STL"
    //                     or: /GX /LD  /MD  /D"EXP_STL"
    // DLL.CPP

    #include "MyHeader.h"
    std::vector<char> MyClass::StaticVectorOfChars;

    // -------------------------------------------
    // Compile options needed: /GX /MDd
    //                     or: /GX /MD
    // EXE.CPP

    #include <iostream>
    #include "MyHeader.h"

    int main ()
    {
        MyClass x;

        for (int i=0; i<5; i++) x.VectorOfInts.push_back(i);
        for (char j=0; j<5; j++) x.StaticVectorOfChars.push_back('a' + j);

        std::vector<int>::iterator vii = x.VectorOfInts.begin();
        while (vii != x.VectorOfInts.end())
        {
            std::cout << *vii;
            std::cout << " displayed from x.VectorOfInts" << std::endl;
            vii++;
        }
        std::vector<char>::iterator vci = x.StaticVectorOfChars.begin();
        while (vci != x.StaticVectorOfChars.end())
        {
            std::cout << *vci;
            std::cout << " displayed from MyClass::StaticVectorOfChars";
            std::cout << std::endl;
            vci++;
        }

        std::vector<MyClass> vy;
        for (i=0; i=5; i++) vy.push_back(MyClass());

        return 1;
    }
				

Ссылки

За дополнительной информацией поиск в следующих разделах справки Visual C++:
Явное создание экземпляра
__declspec
стек
/ MD, / ML, MT, /LD (использование библиотеки времени выполнения)

Свойства

Код статьи: 168958 - Последний отзыв: 23 ноября 2013 г. - Revision: 3.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Ключевые слова: 
kbstl kbinfo kbcode kbhowto kbmt KB168958 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 168958

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com