Como exportar uma instância de uma classe de biblioteca de modelos padrão (STL) e uma classe que contém um membro de dados que é um objecto STL

Traduções de Artigos Traduções de Artigos
Artigo: 168958 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo descreve como efectuar as seguintes tarefas:
  • Exportar uma instância de uma biblioteca padrão do modelo de classe (STL).
  • Exportar uma classe que contém um membro de dados que é um STL objecto.
Tenha em atenção que não pode exportar um modelo genérico. O modelo tem de ser instanciado; ou seja, todos os parâmetros de modelo tem de ser fornecidos e tem de ser totalmente definidos tipos no ponto da instância. Para a instância "pilha <int>;" instancia a classe de pilha STL. A instância força todos os membros de classe pilha <int> ser gerado.

Tenha também em atenção que alguns contentores STL (mapa de conjunto, fila, lista, deque) não podem ser exportadas. Consulte a secção mais informações a seguir para obter uma explicação detalhada.

Mais Informação

A partir do Visual C++ 5.0, é possível forçar uma instância de uma classe de modelo e exportar as instâncias. Para exportar uma instância da classe de modelo, utilize a seguinte sintaxe:

Para exportar uma classe STL

  1. Na DLL e o ficheiro .exe, ligar com a mesma DLL versão do C tempo de execução. Ou ligar ambos com Msvcrt.lib (versão compilação) ou ligar ambos com Msvcrtd.lib (compilação de depuração).
  2. A DLL de fornecer o especificador de __declspec na declaração de instância de modelo de origem a instância de classe STL a DLL.
  3. No ficheiro .exe, fornecem os especificadores externo e __declspec na declaração de instância de modelo para importar a classe da DLL. Isto resulta num aviso C4231 "extensão não padrão utilizada: 'externo' antes de instância explícita de modelo." Pode ignorar este aviso.

Para exportar uma classe com um membro de dados é um objecto STL

  1. Na DLL e o ficheiro .exe, ligar com a mesma DLL versão do C tempo de execução. Ou ligar ambos com Msvcrt.lib (versão compilação) ou ligar ambos com Msvcrtd.lib (compilação de depuração).
  2. A DLL de fornecer o especificador de __declspec na declaração de instância de modelo de origem a instância de classe STL a DLL.

    NOTA: Não é possível ignorar o passo 2. Tem de exportar as instâncias da classe STL que utiliza para criar o membro de dados.
  3. A DLL de fornecer o especificador de __declspec na declaração da classe a exportar a classe a DLL.
  4. No ficheiro .exe, fornecem o especificador de __declspec na declaração da classe para importar a classe da DLL.

    Se a classe exportar tem um ou mais classes base e tem de exportar as classes base. Se a classe que está a exportar contém membros de dados que são do tipo de classe, tem de exportar as classes dos membros de dados.
NOTA: Algumas classes STL utilizar outras classes STL. Também devem ser exportadas destas classes. As classes que devem ser exportadas são listadas na avisos do compilador se compilar com um nível de aviso inferior a 1; que é, /W2, /W3 ou /W4. Nível de aviso 4 gera muitas mensagens de aviso para STL cabeçalhos de e actualmente não é recomendada por essa razão.

Algumas classes STL contêm classes aninhadas. Estas classes não podem ser exportadas. Por exemplo, deque contém um deque::iterator classe aninhados. Se exportar deque, obterá um aviso de que tem de exportar deque::iterator. Se exportar deque::iterator, receberá um aviso de que tem de exportar deque. Isto é causado por uma limitação concebida que depois de uma classe de modelo é instanciada, pode não ser re-instantiated e exportado. O contentor STL apenas que pode ser exportado actualmente é vector. Os contentores (ou seja, mapa conjunto, fila, lista, deque) contêm todas as classes aninhadas e não podem ser exportados.

Quando exporta um contentor STL parametrizado com um tipo definido pelo utilizador (UDT), tem de definir os operadores < e == para o UDT. <myclass>Por exemplo, se exportar vector < MyClass >, tem de definir MyClass::operator < e MyClass operador ==. Isto acontece porque todas as classes de contentor STL têm membro operadores de comparação que requerem a existência dos operadores < e == para o tipo contido. Normalmente, estes não são instanciados uma vez que não são utilizados. Quando declarar uma instância de uma classe de modelo, todas as funções de membros são geradas. Uma vez que as classes de contentor STL têm funções de membro que utilizam os operadores < e == para o tipo contido, tem de implementá-los. Se comparar os objectos do seu UDT não faz sentido, pode definir os operadores de comparação para regressar simplesmente "true".

Quando _DLL símbolo é definida durante a compilação (este símbolo é implicitamente definido quando compilar com /MD ou /MDd para ligar com a versão da DLL do Runtime do C), as seguintes classes STL e vários globais operadores e funções que funcionam com estas classes, já são exportada pela DLL de tempo de execução C. Por conseguinte, não é possível exportá-los a partir da DLL. Isto não deverá causar um problema do programa executável que importa a classe, desde que também utiliza a versão DLL do C tempo de execução:
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)
				
para detalhes específicos sobre os parâmetros de modelo são utilizados e os operadores e funções globais são declarados, consulte o ficheiro de cabeçalho.

Código de exemplo

   // -------------------------------------------
   // 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;
    }
				

Referências

Para mais informações, procure os seguintes tópicos na ajuda do Visual C++:
Instanciação explícita
__declspec
pilha
/ MD, ML, /MT /LD (biblioteca de tempo de execução de utilização)

Propriedades

Artigo: 168958 - Última revisão: 6 de setembro de 2005 - Revisão: 3.0
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 168958

Submeter comentários

 

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