Partilhar via


Desconfiguração do nome de estilo antigo para o modelo exportado instanciações

Um aspecto do trabalho de conformidade com o Visual C++ é permitir que a sobrecarga de especializações em de modelos de função e modelos normais.

Por exemplo, o exemplo a seguir é compilado no Visual Studio .NET 2003 mas falhará no Visual Studio. NET:

// bc_exported_templ_instan.cpp
template<typename T, typename U>
T ConvertTo(const U &u) {
   return static_cast<T>(u);
}

char ConvertTo(const int &i) {
   return static_cast<char>(i);
}

int main() {
   char c1 = ConvertTo(1);
   char c2 = ConvertTo<char, int>(2);
}

Para oferecer suporte a sobrecarga de especializações em de modelos de função e modelos normais, o compilador alterada como ele cria nomes decorados para especializações em modelos de função.Um nome decorado atualizado agora inclui codificação de argumentos modelo bem sistema autônomo codificação dos tipos de parâmetro e retorno de função.Para as funções no exemplo anterior, o compilador do C++ no Visual Studio .NET 2003 gerará as seguinte decorações de nome:

?ConvertTo@@YADABH@Z      – char ConvertTo(const int &);
??$ConvertTo@DH@@YADABH@Z – char ConvertTo<char, int>(const int &);

Isso não deve implica qualquer alterar na forma que você desenvolva seus aplicativos.Uma área em que essa alterar afeta usuários é se a exportar é uma especialização de um modelo de função de uma DLL usada em um aplicativo não tem sido recompilado com o compilador do novo.Por exemplo:

// bc_exported_templ_instan2.h
#include <iostream>
#ifdef _DLL_EXPORT
#define DLL_LINKAGE __declspec(dllexport)
#else
#define DLL_LINKAGE __declspec(dllimport)
#endif

template<typename T>
void f(const T &rT) {
   std::cout << "i = " << rT << std::endl;
}
template DLL_LINKAGE void f<int>(const int &);

O código a seguir será ser compilado para criar a DLL:

// bc_exported_templ_instan2.cpp
// compile with: /D_DLL_EXPORT /EHsc /LD
#include "bc_exported_templ_instan2.h"

Se, em seguida, fizer:

dumpbin /exports bc_exported_templ_instan2.dll

Você verá que o nome decorado da especialização exportado do modelo de função é ??$f@H@@YAXABH@Z.

Se um aplicativo existente tem uma dependência nessa DLL e este aplicativo foi criado com o compilador do Visual C++ no Visual Studio .NET (ou uma versão anterior) e eles não podem ou não desejar recriar esse aplicativo, em seguida, elas receberão um erro em time de execução, porque o aplicativo estará esperando um ponto de entrada com o nome antigo.No entanto, a nova DLL serão apenas ser exportando uma função com o novo nome.

// bc_exported_templ_instan3.cpp
// compile with: /EHsc /link bc_exported_templ_instan2.lib
#include "bc_exported_templ_instan2.h"
int main() {
   f(1);
}

A correção para esse problema é alterar como a DLL é criada para que ele irá exportar tanto o antigo e novo o nome de especialização do modelo de função.Isso é concluído usando /exportar para o programa de link.Por exemplo:

cl /D_DLL_EXPORT /EHsc /LD a.cpp /link /export:?f@@YAXABH@Z=??$f@H@@YAXABH@Z 

Isso faz com que o link para criar uma exportar para os nomes especificados, mas que eles MAP para o mesmo símbolo.

Consulte também

Referência

Alterações significativas no compilador Visual C++