Problème Template

Résolu
lglandeur Messages postés 28 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 20 janvier 2009 - 27 déc. 2008 à 21:43
lglandeur Messages postés 28 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 20 janvier 2009 - 28 déc. 2008 à 12:24
Bonjour,


pour la réalisation d’un programme j’ai besoin d’accéder
à un fichier ini, et comme je ne veux pas être limité à Windows, j’ai eu l’idée
de me créer une class pour lire le fichier ini.


Pour accéder a une valeur du fichier ini j’utilise une
fonction template de ma class, et c’est la que les choses se gâte. Lors de la
compilation tu petit programme de teste j’ai droit a un beau message d’erreur :

 « undefined reference to `std::string
INIParser::GetValue<std::string>(std::string const&, std::string
const&)' »



Voila les sources de mon programme :

Fichier : INIParser.h
<hr size="2" width="100%" />#ifndef INIPARSER_H
#define INIPARSER_H

#include <fstream>    // pour accéder au fichier
#include <sstream>    // pour utiliser istringstream
#include <string>
#include <map>

class INIParser
{
    private:
        std::map<std::string, std::string> ini;
    public:
        INIParser(const std::string &);
        ~INIParser();
        template <class T> T GetValue(const std::string &, const std::string &);
};

#endif // INIPARSER_H
<hr size="2" width="100%" />

Fichier : INIParser.cpp
<hr size="2" width="100%" />#include "INIParser.h"

INIParser::INIParser(const std::string &filename)
{
    std::string section, line, clef, valeur;
    std::size_t pos;
   
    std::ifstream file(filename.c_str());
   
    while (!file.eof())
    {
        std::getline (file, line);
       
        // suppretion des commentaires
        pos = line.find_first_of(';');
        if(pos != std::string::npos)    line.erase (line.begin() + pos, line.end());
       
        // continue si la ligne n'ai pas vide
        if(!line.empty())
        {
            // test si la ligne corespond a une section
            pos = line.find_first_of('[');
            if(pos != std::string::npos)
            {
                line.erase(line.begin(), line.begin() + pos);
                line.erase(line.begin() + line.find_first_of (']'), line.end());
                section = line;
            }
            else    // sinon elle coorespond a une clef
            {
                pos = line.find_first_of('=');
                clef = line.substr (0, pos-1);
                valeur = line.substr (pos+1);
               
                // permet la suppretion de tout les espaces dans la clef                while(std::string::npos !(pos clef.find_first_of(' ')))
                    clef.erase(pos);
               
                clef.insert(0, section + '/');
               
                ini.insert(std::make_pair(clef, valeur));
            }
        }
    }
   
    file.close();
}

INIParser::~INIParser()
{
    ini.clear();
}

template <class T> T INIParser::GetValue(const std::string &Section, const std::string &clef)
{
    std::map<std::string, std::string>::iterator it=ini.find(Section+"/"+clef);
   
    if(it != ini.end())
    {
        std::istringstream iss(it->second);
        T val;
        iss >> val;
        return val;
    }
}
<hr size="2" width="100%" />

Fichier : main.cpp
<hr size="2" width="100%" />#include
#include "INIParser.h"

using namespace std;

int main()
{
    INIParser ini("config.ini");
   
    cout << ini.GetValue<string>("config","text") << endl;
    return 0;
}
<hr size="2" width="100%" />
Si quelqu'un à une idée sur le problème merci de répondre.Cordialement.

3 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2008 à 12:23
Oui, c'est ca : pour les classes template, tu dois tout mettre dans le header, en général tu n'a même pas besoin de .cpp

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
lglandeur Messages postés 28 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
28 déc. 2008 à 12:13
Bonjour,

Alors voila je pense avoir trouvé la solution a mon problème. Pour ce faire il faut que je décrive ma fonction dans mon fichier d’entête, car apparemment une fonction template ne peut être décrite dans un fichier source a part.

Merci de bien vouloir m’expliquer si c’est bien cela la source de mon problème.
0
lglandeur Messages postés 28 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
28 déc. 2008 à 12:24
ok, merci pour la confirmation
0
Rejoignez-nous