2010-12-07 39 views
0

J'essaie de créer deux opérateurs surchargés dans un modèle BSTree.h et je rencontre des erreurs qui ne me disent vraiment pas quel est le problème. Lancer une recherche sur les codes d'erreur séparément ou conjointement n'a rien donné pour moi.Impossible de déclarer 2 amis surchargés << dans un modèle .h

La première surchargée < < pour la BSTree ne cause aucune erreur sur la compilation, mais le 2ème surchargée < < j'ai créé pour mon struct Node revient sans cesse les erreurs suivantes:

erreur C4430: Type manquant spécificateur - int supposé. Note: C++ ne prend pas en charge par défaut-int
erreur C2143: erreur de syntaxe: manquant '' avant '*'

#ifndef BSTREE_H 
#define BSTREE_H 

#include <iostream> 
#include <fstream> 

template <typename T> 
class BSTree{ 

friend ostream& operator<<(ostream&, const BSTree<T>&); 

public: 
    BSTree(); 
    //BSTree(const BSTree &); 
    ~BSTree(); 

    void buildTree(ifstream&); 
    void setType(char); 
    bool getType(char); 

    bool insert(T*); 

    bool isEmpty(); 


private: 
    char type; 

    struct Node{ 
     T* data; 

     //subnode[0] == left subtree 
     //subnode[1] == right subtree 
     Node* subnode[2]; 
    }; 

    Node* head; 
    void destructorHelper(Node* &); 
    bool insertHelper(T*, Node* &); 
    friend ostream& operator<<(ostream&, const Node*&); 

}; 

Le compilateur dit que les erreurs se produisent à la ligne où le code nœud surchargé < < est.

template <typename T> 
ostream& operator<<(ostream &output, const BSTree<T> &out) { 
    if(head != NULL) 
     output << head; 
    return output; 
} 

template <typename T> 
ostream& operator<<(ostream &output, const Node* &out) { 
    if(out != NULL){ 
     output << out->subnode[0]; 
     output << *out->data; 
     output << out->subnode[1]; 
    } 

    return output; 
} 

suis-je pas le droit de déclarer 2 surchargées < < dans le même .h même si elles sont des objets différents? Ou est-ce que je me trompe dans mon code?

Répondre

2

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Habituellement, cela signifie que le compilateur ne connaît pas un identifiant comme un type, il va en supposant qu'il est un nom de paramètre, le type étant implicitement int. (En C de l'ancien il y avait une règle que le int dans un type de paramètre peut être omis.) Code comme

void foo(bar); 

peut émettre cela, si le compilateur ne connaît pas le type bar et assume void foo(int bar).

Ce

template <typename T> 
std::ostream& operator<<(std::ostream &output, const typename BSTree<T>::Node* &out) 
{ 
    // ... 
} 

devrait compiler. (Notez les qualifications std:: et BSTree::.)

+0

Cette partie a travaillé, en faisant simplement const BSTree :: node * renvoyé une erreur de C4346. J'ai dû faire const typename :: BSTree :: Node * out pour faire disparaître l'erreur – Moniker

+1

@Moniker: Ah, j'ai oublié que 'BSTree' est un modèle. Un autre brainfart à moi, le second aujourd'hui ici. Je suis désolé. Je suis content que tu t'en sors malgré tout. Je vais corriger ma réponse de toute façon, celui qui trébuche là-dedans ne devrait pas avoir à lire les commentaires pour obtenir de l'aide. – sbi

0

Peut-être vous avez besoin ceci:

const BSTree :: node * & sur

Node est une structure interne.

0

Je soupçonne que le problème est que ostream n'est pas portée au moment où sont déclarés vos operator<<() fonctions amies.

Soit ajouter using std::ostream; juste à l'intérieur class BSTree{, ou préciser les typenames qualifiés:

friend std::ostream& operator<<(std::ostream&, const BSTree<T>&); 
... 
friend std::ostream& operator<<(std::ostream&, const Node*&); 

Quoi qu'il en soit, les définitions réelles de ces fonctions devront être modifiées de façon similaire. Quoi que vous fassiez, ne être tenté d'utiliser soit using std::ostream; ou (pire encore) using namespace std; dans un fichier d'en-tête à la portée du fichier, car il affectera toutes les déclarations ultérieures dans l'unité de traduction.

1

Vous avez plusieurs erreurs dans votre code:

  • vous devez ajouter <> après les noms de fonctions que vous déclarez comme ami
  • même si vous êtes dans le corps d'un ami fonction , vous devez spécifier les objets sur lesquels vous appelez des méthodes. Rappelez-vous que les fonctions ne sont pas liées à une instance.
  • dans le dernier prototype, le nœud n'est pas accessible en dehors de la classe, il est défini. Vous devez préciser BSTree :: node