2016-04-26 2 views
0

Je suis en train de faire que cela fonctionne, mais il arrive avec un message d'erreurC++ création d'un en-tête qui a modèle pour la surcharge ostream

C2473 " operator << looks like a function definition but there is no parameter list." 

Fondamentalement, c'est un fichier d'en-tête et je veux pour déclarer un espace de noms et un modèle pour une classe outrepassant l'opérateur < <.

Aidez s'il vous plaît! (Je suis aussi nouveau pour stackoverflow et voici ma première question) :)

#ifndef header 
#define header 

namespace nmsp{ 
    template <class T> 
    class expt; //forward declaration of class, so friend function can be defined as a template 
    template <class T> 
    std::ostream& operator << (std::ostream& os, const expt <T> &input); 


template <class T> 
class expt { 


    friend std::ostream& operator << (std::ostream& os, const expt <T>& input); 

private: 
    T *data; 
public: 
    expt() { data = null; } 

}; 

template <class T> 
std::ostream& nmsp:: operator << (std::ostream& os, const expt <class T>& input) { 
    //.... 
} 
} 
} 
#endif 
+0

S'il vous plaît poster un [MCVE ] et les messages d'erreur verbatim la prochaine fois. –

Répondre

0

Voici votre code fixe (voir les commentaires):

namespace nmsp{ 
    template <class T> 
    class expt; // forward declaration of class, so friend function can be 
       // defined as a template 
    template <class T> 
    std::ostream& operator << (std::ostream& os, const expt <T> &input); 


template <class T> 
class expt { 

    // templated friend declarations don't inherit the outer 
    // class template parameters, you need to make them a template separately 
    template <class U> 
    friend std::ostream& operator << (std::ostream& os, const expt <U>& input); 

private: 
    T *data; 
public: 
    expt() { data = nullptr; } 
       // ^^^^^^^ null isn't a thing 

}; 

} 

// Move the definition out of the namespace 
template <class T> 
std::ostream& nmsp:: operator << (std::ostream& os, const expt <T>& input) { 
                  // ^^^ drop class 
    //.... 
    return os; 
} 
// Remove the extra } 

Live Demo

+0

Salut merci pour la réponse super rapide, mais je reçois toujours un tas d'erreurs. J'ai supprimé la classe dans ma définition de l'opérateur << mais le message d'erreur est: "nmsp :: expt": "T" n'est pas un argument de type de template valide pour le paramètre T .... – AliS

+0

@AliS Avez-vous vraiment pris le code de ma démo comme point de départ? La chose la plus importante est la première redéclaration de la fonction 'friend' dans' expt'. –

+0

Je suis désolé je ne savais pas ce que vous voulez dire que j'essayais juste d'obtenir mon code de travail et je suis très stressant. Pourriez-vous nous en expliquer un peu plus sur ce que vous vouliez dire dans votre commentaire: «les déclarations d'amis modélisées n'héritent pas des paramètres du modèle de classe externe, vous devez en faire un modèle séparément»? Parce que dans mon code d'origine, il semble avoir un problème la première fois que j'ai mentionné l'opérateur. (le mot 'opérateur' ne s'est pas allumé comme les autres ...) – AliS