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)
5 Réponses :
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. P>
merci neil :) ça a fonctionné lorsque je déplace la définition de la fonction à l'en-tête
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é
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
Il existe deux modèles de compilation pour les modèles:
Vous pouvez utiliser mais je ne suis pas sûr que tout Le compilateur le supporte. P> p>
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.
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)
Vous devez ajouter Test_api uniquement avec des instanciations de modèle. Sinon, il y a une erreur de compilation (C2491)
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 ); ......