Проблемы с возвратом ссылки на векторный стек - PullRequest
1 голос
/ 01 ноября 2009

Я работаю над приложением, которое создает вектор структур для элементов в данном каталоге и возвращает ссылку на вектор для его чтения. Я получаю следующие ошибки при попытке скомпилировать приведенный ниже пример кода:

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

Что я здесь не так делаю, и есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2009

Вы сделали 'indexItem' вектором, возможно, вы просто хотите, чтобы он был тем типом, который вы хотите поместить в 'indexItems'. Кроме того, я бы создал новую структуру в вашем цикле:

    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 голосов
/ 01 ноября 2009

Вы определяете vector с именем indexItem:

vector<indexStruct> indexItem;

Это просто массив. Таким образом, следующие строки должны быть изменены, чтобы ссылаться на определенный элемент вектора:

indexItem.name = dirItem->d_name;// should be indexItem[..].name or indexItem.at(..).name
indexItem.path = dirPath;        // same as above!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...