2010-11-09 5 views
3

je le code suivant:opérateur stringstream << pour un type de modèle

template <class T> 
static std::string ToString(const T& t) 
{ 
    stringstream temp; 
    temp << t; 
    return temp.str(); 
} 

Il compile sans problème avec Visual C++ sous Windows, mais en essayant de le compiler avec GCC sous Linux, je reçois l'erreur suivante :

no match for 'operator<<' in 'temp << t' 

Quelle pourrait être la raison de cela?

Merci d'avance.

+12

Cela dépend du type 'T'. Qu'Est-ce que c'est? –

Répondre

4

Cela dépend du type T comme dit Space_C0wb0y.

Vérifiez le code suivant

#include <sstream> 
#include <iostream> 

template<typename T> 
static std::string ToString(const T& t){ 
    std::stringstream temp; 
    temp << t; 
    return temp.str(); 
} 
struct empty{}; 
struct non_empty{ 
    std::string str; 
    non_empty(std::string obj):str (obj){} 
    friend std::ostream& operator << (std::ostream& out, const non_empty &x); 
}; 

std::ostream& operator << (std::ostream& out, const non_empty &x){ 
    out << x.str; 
    return out; 
} 

int main(){ 
    std::string s = ToString<double>(12.3); // this will work fine 
/********************************************************************************* 
    * std::string k = ToString(empty()); // no match for 'operator<<' in 'temp << t'* 
    *********************************************************************************/ 
    std::string t = ToString(non_empty("123")); // this works too 

} 

Un appel à ToString(empty()); donne la même erreur que vous avez, mais ToString(non_empty("123")); est fine. Qu'est-ce que cela implique?

0

Il est possible que vous manquiez simplement le #include<sstream> du haut de votre dossier.

Ceci expliquerait pourquoi un code identique peut être compilé sous Windows, en raison de différences entre les en-têtes standard.

Cela a été la solution dans mon cas, lors de l'utilisation du modèle avec le type const char*.

Questions connexes