begin process at 2012 05 29 22:33:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Problème Template


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème Template

samedi 27 décembre 2008 à 21:43:33 | Problème Template

lglandeur

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

#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


Fichier : INIParser.cpp

#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;
    }
}


Fichier : main.cpp

#include <iostream>
#include "INIParser.h"

using namespace std;

int main()
{
    INIParser ini("config.ini");
   
    cout << ini.GetValue<string>("config","text") << endl;
    return 0;
}


Si quelqu'un à une idée sur le problème merci de répondre.

Cordialement.

dimanche 28 décembre 2008 à 12:13:53 | Re : Problème Template

lglandeur

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.

dimanche 28 décembre 2008 à 12:23:06 | Re : Problème Template

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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

dimanche 28 décembre 2008 à 12:24:17 | Re : Problème Template

lglandeur

ok, merci pour la confirmation


Cette discussion est classée dans : string, std, line, pos, iniparser


Répondre à ce message

Sujets en rapport avec ce message

utlisation de la classe string [ par borgeomi ] borgeomibonjouuuuuuur !!!!!nouveau programmeur en C ++ ( mais vieux en cobol )sous visual C++création d'une fonction qui enlève les espaces de début e Problème avec les std::string [VC++6.0] [ par D1m3x ] Je suis en train de programmer un petit programme où j'utilise les templates, c'est la première fois que j'en utilise, alors je ne connais pas encore Probleme de hash_map avec les string [ par playmo420 ] SalutJ'ai besoin d'utiliser une table de hachage dans un programme mais lorsque je prend une cle de type string, il y a une erreur... (ca fonctionne a Peut-on donner une longueur fixe à std::string [ par marik7335 ] Salut à tous,Je voudrais savoir si c'est possible d'imposer une longueur fixe à la variable suivante : std::string var ? tableau [ par ToToL ] Bonjour,j'ai un tableau créé de cette maniere :std::vector Pos;et a un moment j'ai besion d'en créé un autre qui doit etre une copie de Pos , quel es Remplir un string, probleme [ par ChamY ] Bonjour, Je suis en 1ere année de BTS info. J'ai un projet a realiser pendant ces vancances : une bibliotheque. J ai un ptit probleme lors de l uti convertir une string en float [ par jean_vandevere ] Bonjour à tous, je cherche à convertir une valeur de format string en un float en dev C++.Le code que je tape est le suivant et consite à aller lire std::string to LowerCase [ par TeLeTUbIz ] Salut !   Ayant la fleme de programmer cet algo, je voudrais savoir si qqu'un connait une méthode rapide de changement de casse d'un std::string.Voilà Probleme EDL (VC++7) [ par vecchio56 ] Bonjour J'ai deux problèmes d'edition de liens: Dialog.obj : error LNK2001: symbole externe non résolu "public: void __thiscall std::_String_base::_X compilation .o [ par xantro ] bonjour a tous et a toutes. J'aurai besoin d 'un coup de main pour un probleme de compilation. Voila, j'ai mon programme avec plusieurs fichiers (fic


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 7,956 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales