STL (표준 템플릿 라이브러리) 클래스와 STL 개체가 데이터 멤버가 클래스 인스턴스를 내보내는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 168958 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 다음 작업을 수행하는 방법을 설명합니다.
  • 표준 템플릿 라이브러리 인스턴스를 내보내기 STL) 클래스.
  • STL 데이터 구성원을 포함하는 클래스를 내보낼 개체.
참고 일반화된 서식 파일을 내보낼 수 없습니다. 템플릿을 인스턴스화할 수 합니다. 그리고 즉, 모든 템플릿 매개 변수를 제공해야 인스턴스화 시점 맨 완전히 정의된 형식은 같아야 합니다. 인스턴스 "스택에 대해 <int>;" STL 스택 클래스를 인스턴스화합니다. 인스턴스화 클래스는 스택 <int>모든 구성원이 생성될 업데이트되도록 합니다.

또한 일부 STL 컨테이너를 맵, 설정, 큐, 목록, deque 내보낼 수 유의하십시오. 자세한 설명을 위해 따라야 하는 추가 정보 절을 참조하십시오.

추가 정보

Visual C++ 5 .0부터는 템플릿 클래스의 인스턴스화를 강제로 인스턴스화 내보낼 수 있습니다. 템플릿 클래스를 인스턴스화 내보내려면 다음 구문을 사용하십시오.

STL 클래스 내보내기 수

  1. 같은 DLL에 링크 DLL 및 .exe 파일이 있는 C 런타임 버전을. Msvcrt.lib 릴리스 빌드 사용하여 두 연결 또는 모두 Msvcrtd.lib 디버그 빌드 연결하십시오.
  2. DLL에 __declspec 지정자를 템플릿 인스턴스화 선언에서 STL 클래스 인스턴스화 DLL에서 내보내기 제공하십시오.
  3. .exe 파일에서 DLL에서 클래스를 가져올 extern 및 __declspec 지정자를 템플릿 인스턴스화 선언에서 제공하십시오. 이 경고는 C4231 결과가 "비표준 확장이 사용됨: 'extern' 템플릿 명시적 인스턴스화 앞에." 이 경고는 무시할 수 있습니다.

STL 개체가 있는지 데이터 멤버 포함하는 클래스 내보내기

  1. 같은 DLL에 링크 DLL 및 .exe 파일이 있는 C 런타임 버전을. Msvcrt.lib 릴리스 빌드 사용하여 두 연결 또는 모두 Msvcrtd.lib 디버그 빌드 연결하십시오.
  2. DLL에 __declspec 지정자를 템플릿 인스턴스화 선언에서 STL 클래스 인스턴스화 DLL에서 내보내기 제공하십시오.

    참고: 2 단계를 건너뛸 수 없습니다. 데이터 멤버를 만들 수 있는 STL 클래스의 인스턴스화를 내보내야 합니다.
  3. DLL에 __declspec 지정자는 클래스 선언에서 클래스 DLL에서 내보내기 제공하십시오.
  4. .exe 파일에서 DLL에서 클래스를 가져올 __declspec 지정자는 클래스 선언에서 제공하십시오.

    하나 이상의 기본 클래스가 있습니다 클래스를 내보내는 경우에는 기본 클래스를 내보내야 합니다. 다음 내보내는 클래스가 클래스 형식의 데이터 멤버가 있으면 데이터 멤버가 클래스 내보내야 합니다.
참고: 일부 STL 클래스를 다른 STL 클래스를 사용합니다. 이러한 클래스는 또한 내보내야 합니다. 경고 수준 1; 것보다 낮은,/W2,/W3, 또는/W4 컴파일하는 경우 내보낼 수 있는 클래스는 컴파일러 경고는 나열됩니다. 경고 수준 4 많은 STL 헤더에 대한 경고 메시지 생성하고 이유로 현재 권장되지 않습니다.

일부 STL 클래스는 중첩된 클래스가 포함되어 있습니다. 이러한 클래스는 내보낼 수 없습니다. 예를 들어, 중첩된 클래스 deque::iterator deque 포함되어 있습니다. deque 내보낼 경우 deque::iterator 내보내야 합니다 경고를 메시지가 나타납니다. deque::iterator 내보낼 경우 deque 내보내야 합니다 경고를 볼 수 있습니다. 이 템플릿 클래스가 인스턴스화되면 이를 re-instantiated 내보낸 및 않는 것이 디자인된 제한에 의해 발생할 수 있습니다. 현재 내보낼 수 있는 유일한 STL 컨테이너를 벡터입니다. 다른 컨테이너 (즉,: 맵, 설정, 큐, 목록, deque) 모든 중첩된 클래스를 포함하며 내보낼 수 없습니다.

연산자를 정의해야 합니다 (UDT (사용자 정의 형식을 사용하여 매개 변수화된 STL 컨테이너를 내보낼 때 < 및 UDT에 대한 ==. <myclass>예를 들어, 벡터 < MyClass > 내보낼 경우 MyClass::operator 정의해야 합니다 < 및 MyClass 연산자에 ==. 연산자는 존재를 필요로 하는 멤버 비교 연산자는 모든 STL 컨테이너를 클래스가 있어야 때문입니다 < 및 포함된 형식에서는 ==. 사용되지 않기 때문에 일반적으로 이러한 인스턴스화할 수 없습니다. 모든 멤버 함수는 템플릿 클래스 인스턴스를 인스턴스화할 때 생성됩니다. STL 컨테이너에 클래스의 연산자를 사용하는 멤버 함수를 가지므로 < == 및 포함된 형식에 대해 이를 구현해야 합니다. 사용자의 UDT 개체 비교 의미가 없습니다 경우 비교 연산자는 단순히 "True"를 반환하도록 정의할 수 있습니다.

이미 기호 _DLL (이 기호가 암시적으로/MD 또는/MDd C 런타임 DLL 버전을 연결하려면 사용하여 컴파일할 때 정의된), 다음 STL 클래스 및 다양한 전역 연산자는 컴파일하고 이러한 클래스에 대해 작동하는 함수 동안 정의할 때 C 런타임 DLL에서 내보내집니다. 따라서 해당 DLL에서 내보낼 수 없습니다. 이 또한 C 런타임 DLL 버전을 사용하여 한 클래스에서 가져온 실행 프로그램 문제가 발생할 합니다:
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 - 마지막 검토: 2005년 9월 6일 화요일 - 수정: 3.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
키워드:?
kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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