2009-11-01 2 views
1

Je travaille sur une application qui construit un vecteur de structures pour des éléments dans un répertoire donné et retourne une référence du vecteur pour qu'il soit lu, je reçois les erreurs suivantes en essayant de compiler l'exemple Code ci-dessous:Problèmes renvoyant la référence de pile de vecteurs

1. 'class std::vector<indexStruct, std::allocator<indexStruct> >' has no member named 'name' 
2. no matching function for call to `std::vector<indexStruct, std::allocator<indexStruct> >::push_back(std::vector<indexStruct, std::allocator<indexStruct> >&)' 

exampleApp.cpp

#include "exampleApp.h" 

exampleApp::exampleApp() 
{ 
    this->makeCatalog(); 
} 

char* findCWD() 
{ 
    char* buffer = new char[_MAX_PATH]; 
    return getcwd(buffer, _MAX_PATH); 
} 

void exampleApp::makeCatalog() 
{ 
    char* cwd = this->findCWD(); 
    vector<indexStruct> indexItems; 

    this->indexDir(cwd, indexItems); 
} 

void exampleApp:indexDir(char* dirPath, vector<indexStruct>& indexRef) 
{ 
    DIR *dirPointer = NULL; 
    struct dirent *dirItem = NULL; 
    vector<indexStruct> indexItems; 
    vector<indexStruct> indexItem; 

    try 
    { 
     if ((dirPointer = opendir(dirPath)) == NULL) throw 1; 
     while (dirItem = readdir(dirPointer)) 
     { 
      if (dirItem == NULL) throw 2; 
      if (dirItem->d_name[0] != '.') 
      { 
       indexItem.name = dirItem->d_name; 
       indexItem.path = dirPath; 
       indexItems.push_back(indexItem); 
       indexItem.clear(); 
      } 
     } 

     indexRef.swap(indexItems); 
     closedir(dirPointer); 
    } 
    catch(int errorNo) 
    { 
     //cout << "Caught Error #" << errorNo; 
    } 
} 

exampleApp.h

#ifndef EXAMPLEAPP_H 
#define EXAMPLEAPP_H 

#include <iostream.h> 
#include <dirent.h> 
#include <stdlib.h> 
#include <vector.h> 
using namespace std; 

struct indexStruct 
{ 
    char* name; 
    char* path; 
}; 

class exampleApp 
{ 
public: 
    exampleApp(); 
private: 
    char* findCWD(); 
    void makeCatalog(); 
    void indexDir(char* dirPath, vector<indexStruct>& indexRef); 
}; 

#endif 

Qu'est-ce que je fais de mal ici, et y a-t-il une meilleure façon de procéder?

+0

Sur quelles lignes sont les erreurs? – Mark

Répondre

0

Vous avez fait « indexItem » un vecteur, il vous suffit probablement à être le type que vous voulez mettre dans « » indexItems . Aussi, je créerais la nouvelle structure dans votre boucle:

while (dirItem = readdir(dirPointer)) 
    { 
     if (dirItem == NULL) throw 2; 
     if (dirItem->d_name[0] != '.') 
     { 
      indexStruct indexItem; 

      indexItem.name = dirItem->d_name; 
      indexItem.path = dirPath; 
      indexItems.push_back(indexItem); 
     } 
    } 
+0

J'ai changé le code à ce que vous avez suggéré et c'est la nouvelle erreur de compilation: 'struct indexItem' n'a aucun membre nommé 'clear' en supprimant indexItem.clear(); le corrige mais maintenant je me demande si j'ai besoin de détruire la structure indexItem après qu'elle ait été poussée sur le vecteur? –

+0

Oui, le clair ne devrait pas être là, désolé. Si vous n'utilisez pas 'nouveau', vous n'avez pas besoin de vous soucier de supprimer quoi que ce soit. L'indexItem sera simplement copié partout où il est utilisé. Il est copié dans le vecteur et le local est détruit quand la portée du 'if' est laissée. – joshperry

+0

Très bien merci pour l'aide, tout fonctionne bien maintenant! –

0

Vous définissez un vector appelé indexItem:

vector<indexStruct> indexItem; 

Ceci est juste un tableau. Ainsi, les lignes suivantes doivent être modifiés pour faire référence à un élément spécifique du vecteur:

indexItem.name = dirItem->d_name;// should be indexItem[..].name or indexItem.at(..).name 
indexItem.path = dirPath;  // same as above! 
+0

J'ai changé le code comme vous l'avez dit et il compile sans erreurs mais l'exe tourne et meurt sans aucune erreur ou quoi que ce soit. –

Questions connexes