URL: https://linuxfr.org/forums/programmation-c/posts/probleme-de-templates-undefined-reference Title: Problème de templates: undefined reference Authors: mrr Date: 2012年12月16日T18:14:37+01:00 Tags: Score: 0 Salut, J'essaye de coder une fonction en C++ qui sépare un URI en deux: le protocole, et le reste. mailto:quux@foo.bar -> ("mailto", "quux@foo.bar") La fonction doit donc retourner deux valeur. J'ai utilisé pour cela un conteneur `std::pair`. Elle prends en argument un `std::string`. namespace URI { std::pair splitScheme (const std::string & str); } Jusque là, pas de problèmes: la fonction était sale mais marchais bien. Là où ça se gâte, c'est que je ne suis pas sûr de toujours utiliser une `std::string`: je voudrais que ma fonction fonctionne aussi avec des `std::wstring` et des `std::u16string`. J'ai donc essayé de transformer ma fonction en fonction template: template std::pair splitScheme (const STR & str); Au final, j'ai le code suivant: // URI.hpp #ifndef _DEF_URI_HPP_ #define _DEF_URI_HPP_ #include #include #include namespace URI { template std::pair splitScheme (const STR & str); } #endif // URI.cpp #include "URI.hpp" template std::pair URI::splitScheme (const STR & str) { typename STR::size_type s = str.find(':'); typename STR::value_type c; unsigned int i; // if ((s == STR::npos) || str.empty()) return make_pair("", str); else { for (i = 0; i < s; i++) { c = str.at(i); if (!((c>= 'A' && c <= 'Z') || (c>= 'a' && c <= 'z') || ((i>= 1) && (c>= '0' && c <= '9')) || ((i>= 1) && (c == '+' || c == '-' || c == '.' )))) return make_pair("", str); } return make_pair(str.substr(0, i), str.substr(s+1)); } // } #include "URI.hpp" #include #include #include int main (int argc, char ** argv) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " uri" << std::endl; return 1; } std::string s(argv[1]); std::pair p; p = URI::splitScheme(s); if (!p.first.empty()) std::cout << "Scheme: " << p.first << std::endl; std::cout << "2nd part: " << p.second << std::endl; return 0; } Au final, quand je compile le code, j'obtiens un message d'erreur de ld: % g++ URI.cpp main.cpp -o test /tmp/cc1YnskK.o: In function `main': main.cpp:(.text+0xb5): undefined reference to `std::pair URI::splitScheme(std::string const&)' collect2: error: ld returned 1 exit status Si je déclare manuellement le prototype non défini, ça ne fait rien de plus: template std::pair splitScheme (const std::string & str); Quelqu'un a une idée ? Peut être qu'utiliser un `std::pair` n'est pas la bonne méthode ? Merci d'avance :-)

AltStyle によって変換されたページ (->オリジナル) /