2011-10-13 1 views
1

J'ai déclaré une fonction d'assistance à une méthode d'une classe I déclarée dans un fichier d'entête, et pour une raison quelconque lorsque je compile le fichier de code source I obtenir une erreur me disant que j'ai déclaré une variable ou un champ comme nul. Je ne suis pas sûr de savoir comment interpréter cela puisque mon but était que la fonction soit déclarée nulle.La fonction void provoque une erreur de compilation "variable ou champ 'funcName' déclaré vide"

Les erreurs du compilateur sont les suivantes:

k-d.cpp:10: error: variable or field ‘insert_Helper’ declared void 
k-d.cpp:10: error: ‘node’ was not declared in this scope 
k-d.cpp:10: error: ‘root’ was not declared in this scope 
k-d.cpp:10: error: expected primary-expression before ‘*’ token 
k-d.cpp:10: error: ‘o’ was not declared in this scope 
k-d.cpp:10: error: expected primary-expression before ‘int’ 

L'équivalent de la ligne 10 dans le code ci-dessous est la ligne 5.

Le code source est la suivante:

#include <iostream> 
#include "k-d.h" //Defines the node and spot structs 
using namespace std; 

void insert_Helper(node *root, spot *o, int disc) { 
    (...Some code here...) 
} 

void kdTree::insert(spot *o) { //kdTree is a class outlined in k-d.h 
    insert_Helper(root, o, 0); //root is defined in k-d.h 
} 

Si n'importe qui peut repérer tout ce qui ferait que le compilateur ne voit pas cela comme une fonction, il serait grandement apprécié. Merci!

P.S. Je n'ai pas marqué cela comme un kdtree parce que je suis sûr que la solution ne dépend pas de cet aspect du code.

Mise à jour:

Voici kd.h:

#ifndef K_D_H 
#define K_D_H 

// Get a definition for NULL 
#include <iostream> 
#include <string> 
#include "p2.h" 
#include "dlist.h" 

class kdTree { 
    // OVERVIEW: contains a k-d tree of Objects 

public: 

    // Operational methods 

    bool isEmpty(); 
    // EFFECTS: returns true if tree is empy, false otherwise 

    void insert(spot *o); 
    // MODIFIES this 
    // EFFECTS inserts o in the tree 

    Dlist<spot> rangeFind(float xMax, float yMax); 

    spot nearNeighbor(float X, float Y, string category); 

    // Maintenance methods 
    kdTree();         // ctor 
    ~kdTree();         // dtor 

private: 
    // A private type 
    struct node { 
     node *left; 
     node *right; 
     spot *o; 
    }; 

    node *root; // The pointer to the 1st node (NULL if none) 
}; 

#endif 

Et p2.h:

#ifndef P2_H 
#define P2_H 
#include <iostream> 
#include <string> 
using namespace std; 

enum { 
    xCoor = 0, 
    yCoor = 1 
}; 

struct spot { 
    float key[2]; 
    string name, category; 
}; 

#endif 
+3

Montrez-nous "k-d.h". – cnicutar

+0

Vous devez publier un exemple de code suffisant pour illustrer le problème. Essayez de l'isoler au strict minimum absolu où l'erreur se produit - 9 fois sur 10, cela résoudra le problème de toute façon, et si ce n'est pas le cas, vous pouvez le poster et quelqu'un devrait repérer l'erreur très rapidement. – Ayjay

+0

Veuillez fournir un exemple que nous pouvons utiliser pour reproduire l'erreur, comme décrit [ici] (http://sscce.org). –

Répondre

0

Tout d'abord, vous devez vous qualifier kdTree::node car il est déclaré comme structure interne. Deuxièmement, vous devez faire insert_Helper un membre de votre classe parce que node est privé.

Astuce supplémentaire: supprimer les using directives des fichiers .h, et se qualifier plutôt toute votre utilisation de string, etc. Pensez à inclure cet en-tête dans un grand nombre de fichiers cpp.

+0

S'il en fait un membre de la classe, alors il n'aura pas besoin de se qualifier. –

+0

Je pense que je vais le faire au lieu de rendre le nœud public. J'essayais de garder cela comme une partie «cachée» de la mise en œuvre. – smitty

+0

Merci pour le conseil sur "l'utilisation", je devrais sortir de cette habitude de le faire. – smitty

0

node est un type imbriqué au sein kdTree, dans la définition de votre fonction, vous devez nommez-le comme kdTree::node. Cependant, puisque node est privé, vous devrez également faire quelque chose à ce sujet.

+0

J'essayais de garder celui-là à l'intérieur de la classe, mais je pense que ça va devoir être un membre du public. Merci pour le conseil, je déteste quand je rencontre des erreurs stupides comme ceci: - – smitty

+0

destiné à mettre un smiley là, mais appuyez sur la touche Entrée au lieu du décalage lol – smitty

+0

@smitty: Vous ne devez pas nécessairement le rendre public, il On dirait que votre classe pourrait utiliser un ami. –

Questions connexes