10
votes

Impossible d'exporter la fonction de modèle

J'ai une classe nommée "SIMOBJECT":

1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<float>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,float)" (??$updateParamValue@M@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@M@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setTerrainSize(float)" (?setTerrainSize@ITerrainDrawable@simTerrain@@QAEXM@Z)
1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<class osg::Vec4f>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class osg::Vec4f)" (??$updateParamValue@VVec4f@osg@@@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@VVec4f@osg@@@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setSatelliteTextureBorders(class osg::Vec2f,class osg::Vec2f)" (?setSatelliteTextureBorders@ITerrainDrawable@simTerrain@@QAEXVVec2f@osg@@0@Z)


0 commentaires

5 Réponses :


15
votes

C ++ ne prend pas vraiment en charge la compilation séparée du code de modèle - Vous devez mettre la définition du modèle dans un fichier d'en-tête.


1 commentaires

merci neil :) ça a fonctionné lorsque je déplace la définition de la fonction à l'en-tête



5
votes

La mise en œuvre complète d'une classe de modèle doit être dans l'en-tête de cette classe de modèle. Les normes ANSI / ISO pour C ++ permettent un moyen de mettre la mise en œuvre dans une unité de compilation distincte à l'aide du mot clé Exporter , mais il existe actuellement des compilateurs qui soutiennent réellement cela.

Pour plus d'informations Lire Ceci et Ceci.


1 commentaires

J'utilise VisualStudio2008 et la réponse à l'exportation est la suivante: AVERTISSEMENT C4237: "Exporter" mot-clé n'est pas encore pris en charge, mais réservé à une utilisation future



6
votes

Il existe deux modèles de compilation pour les modèles:

  1. Modèle de compilation Inclusion (comme Y compris le fichier d'en-tête)
  2. Modèle de compilation séparé (séparation de l'interface de la mise en œuvre)

    Vous pouvez utiliser mot-clé d'exportation au moment de la définition du modèle pour la 2e option. xxx

    mais je ne suis pas sûr que tout Le compilateur le supporte.


3 commentaires

J'utilise VisualStudio2008 et la réponse à l'exportation est la suivante: AVERTISSEMENT C4237: "Exporter" mot-clé n'est pas encore pris en charge, mais réservé à une utilisation future


VC ++ 7.0 ne le supporte pas, peut être la prochaine version pourrait en avoir un support. Mais je l'exécute sur le compilateur Linux GNU C ++ 8.2 qui le supporte.


Je souhaite que votre réponse soit vraie, mais stupide vs ne le supporte pas encore: / Je n'aime pas écrire les définitions de la fonction à l'en-tête.



4
votes

Voici l'exemple de travail:

00000000 characteristics
4FDEF629 time date stamp Mon Jun 18 12:34:33 2012
    0.00 version
       1 ordinal base
       3 number of functions
       3 number of names

ordinal hint RVA      name

      1    0 00001032 ??$foo@D@@YAXD@Z = @ILT+45(??$foo@D@@YAXD@Z)
      2    1 00001014 ??$foo@H@@YAXH@Z = @ILT+15(??$foo@H@@YAXH@Z)


1 commentaires

Vous devez ajouter Test_api uniquement avec des instanciations de modèle. Sinon, il y a une erreur de compilation (C2491)



5
votes

Vous devez spécifier (le fichier CPP est bon) Spécialisation des modèles. Cela signifie que vous devez exporter toute combinaison d'arguments de modèle, vous allez utiliser:

template __declspec(dllexport) void updateParamValue<int>( const std::string& name, T val );
template __declspec(dllexport) void updateParamValue<short>( const std::string& name, T val );
......


0 commentaires