Невозможно создать вектор класса структур - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать пустой вектор структур. Я буду добавлять элементы во время выполнения с помощью push_back ().

Общая структура - это отдельный класс, имеющий вектор объектов Resource, и каждый объект Resource должен иметь этот структурный вектор pipe. Я не понимаю, почему это объявление не рассматривается как обычная переменная класса. В Resource. cpp подсказка vscode дает мне упоминание о распределителе. Я не знаю, что это такое, и не знаю, как это применимо.

Resource.h

#include <vector>

class Resource {
    public:
    int typeSize;
    typedef struct PipelineSlot{
        bool isBusy;        
        uint32_t busyCycle; 
        Instruction *occupiedBy; 
    } pls_t;
    std::vector<pls_t> pipeline; //why doesn't this create a class variable?

    static bool pushFU(Instruction* instr, int cycle, std::vector<Resource> &fuVector);
};

Ресурс. cpp

#include <Resource.h>
typedef struct PipelineSlot pls_t;

static bool pushFU(Instruction* instr, int cycle, std::vector<Resource> &fuVector) {
    for (auto fu : fuVector) { 
        std::vector<pls_t> pipe = fu.pipeline; //IDE doesn't like this
        if (fu.pipeline.size() > 0) { 
            if (fu.pipeline.back().busyCycle != cycle && fu.pipeline.size() < Resource::resourceLatency.find(fu.type)->second) { 
                pls_t newInstr {true, cycle, instr};
                fu.pipeline.push_back(newInstr); //IDE doesn't like this
                return true;
            }
        } else if (fu.pipeline.size() == 0) {
            pls_t newInstr {true, cycle, instr};
            fu.pipeline.push_back(newInstr); //IDE doesn't like this
            return true;
        }
    }
    return false;
}

Не уверен, что это актуально, но IDE имеет проблему только с вызовами push_back () не с другими векторными методами (чего я тоже не понимаю). Конечная цель состоит в том, чтобы иметь класс-класс структур, которые я могу изменить во время выполнения. Как мне этого добиться?

РЕДАКТИРОВАТЬ: VSCode дает мне эту подсказку, когда я наводю указатель мыши на push_back () линии:

no instance of overloaded function "std::vector<_Tp, _Alloc>push_back [with _Tp=Resource::pls_t, Alloc=std::allocator<Resource::pls_t]" matches the argument list -- argument types are: (pls_t) -- object type is: std::vector<Resource::pls_t, std::allocator<Resource::pls_t>>

Компилятор говорит мне об этом (множество таких ошибок):

error: ‘class Resource’ has no member named ‘pipeline’; did you mean ‘typeSize’?
             if (fu.pipeline.size() > 0) { behavior

Примечание: я студент колледжа с фоном c, но ОЧЕНЬ новый с c ++.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Итак, вот фундаментальная ошибка

class Resource
{
    typedef struct PipelineSlot {
        bool isBusy;        
        uint32_t busyCycle; 
        Instruction *occupiedBy; 
    } pls_t;
};

Поскольку PipelineSlot находится внутри класса Resource, здесь созданы имена Resource::PipelineSlot и Resource::pls_t, а не (как вы, кажется, думаете) PipelineSlot и pls_t.

За пределами Resource класса PipelineSlot и pls_t должны быть квалифицированы как Resource::. Таким образом, этот код будет работать

std::vector<Resource::pls_t> pipe = fu.pipeline;

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

Но затем вы запутали вещи еще больше, создав новый typedef typedef struct PipelineSlot pls_t;. Это определение полностью отличается от предыдущего, поскольку оно дано вне класса Resource, а типы, объявленные здесь PipelineSlot и pls_t, вообще не имеют никакого отношения к ранее объявленным типам.

0 голосов
/ 15 апреля 2020

Использование:

std::vector<Resource::pls_t> pipe = fu.pipeline; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...