Newsgroup: it.comp.lang.c++
Titolo: funzione template NumtoStr

Ho creato una funziona che converta "qualsiasi" tipo in string:
template <typename T>
string NumToString(T num)
{
    ostringstream myStream;
    myStream << num << flush;
    return(myStream.str());    
}
e non da nessun errore. Perché quando la chiamo:
string a;
char n = 10;
a = NumToString(n);
mi dice:
undefined reference to `std::basic_string<char, std::char_traits<char>,
std::allocator<char> > NumToString<char>(char)'

> template <typename T>
hai provato con <class T>?

 hai provato con <class T>?
sì, uguale

 sě, uguale
Hai incluso sstream? Non si sa mai...
Kiuhnm

 Kiuhnm
sì, io ho ora due funzioni del tipo:
string IntToString(int num)
{
    ostringstream myStream;
    myStream << num << flush;
    return(myStream.str());
}
string DoubleToString(double num)
{
    ostringstream myStream;
    myStream << num << flush;
    return(myStream.str());
}
e volevo riunirle in una con un template. L'errore è relativo alla chiamata
della funzione, non alla sua definizione:
undefined reference to `std::basic_string<char, std::char_traits<char>,
std::allocator<char> > NumToString<int>(int)'

 std::allocator<char> > NumToString<int>(int)'
Credo che l'errore riguardi direttamente il g++.
Kiuhnm

la dichiarazione dei template l'hai messa direttamente nel header e non
nel file oggetto?

 std::allocator<char> > NumToString<char>(char)'
Perche' non posti un programmino completo e compilabile (a meno
dell'errore, ovviamente) in modo che possiamo indicarti l'errore invece
di tirare a indovinare?
Ciao,
Nicola

 nel file oggetto?
in tutti e due

Nicola Musatti wrote:

subito:
----------FILE HEADER "utilities.h"-----------
#ifndef UTILITIES_H
#define UTILITIES_H
#include <string>
template <typename T>
std::string NumToString(T num);
std::string IntToString(int num);
std::string DoubleToString(double num);
#endif
----------------------------------------------
--------IMPLEMENTAZIONE "utilities.cpp"-------
#include <fstream>
#include <string>
#include <sstream>
#include "utilities.h"
using namespace std;
template <class T>
string NumToString(T num)
{
    ostringstream myStream;
    myStream << num << flush;
    return(myStream.str());
}
string IntToString(int num)
{
    ostringstream myStream;
    myStream << num << flush;
    return(myStream.str());
}
string DoubleToString(double num)
{
    ostringstream myStream;
    myStream << num << flush;
    return(myStream.str());
}
--------------------------------------
------------main.cpp------------------
#include "utilities.h"
#include <string>
#include <iostream>
int main()
{
    int a = 10;
    std::string str = IntToString(a); //ok
    std::cout << str;
    str = NumToString(a);   //se commento questa riga non viene 
                            //prodotto nessun errore
    std::cout << str;
}
----------------------------------------
compilo con (gcc 4.1.0):
g++ -c utilities.cpp
g++ -o b b.cpp utilities.o
errore:
/tmp/ccQu9O5H.o: In function `main':
b.cpp:(.text+0x9e): undefined reference to `std::basic_string<char,
std::char_traits<char>, std::allocator<char> > NumToString<int>(int)'
collect2: ld returned 1 exit status

 template <class T>
I template vanno messi nel file utilities.h
Ciao
  Andrea

Andrea Palazzi wrote:

Non capisco... tutta l'implementazione? Ho provato, stesso errore.

 Non capisco... tutta l'implementazione? Ho provato, stesso errore.
Evidentemente hai sbagliato qualcosa, perche' le cose stanno come dice
Andrea.
Ciao,
Nicola


Si.
Senti, io ho scritto questi diverso tempo fa, riguardandoli adesso
non sono il massimo ma funzionano; comunque puoi sempre usare
boost::lexical_cast oppure googlare, alla fine anche io ho fatto cosě ;-)
Ciao
  Andrea
----------
#ifndef UTILS_HPP_INCLUDED
#define UTILS_HPP_INCLUDED
#include <ios>
#include <string>
#include <sstream>
template<class T> std::string toString(T val)
{
        std::stringstream ss;
        std::string ans;
        ss << val;
        ss >> ans;
        return ans;
}
template<class T> T toVal(std::string str, int base=10)
{
        std::istringstream ss(str);
        T ans;
        ss >> std::setbase(base) >> ans;
        return ans;
}
#endif /* UTILS_HPP_INCLUDED */