C++ Error: use of deleted function during constructor call of custom class

C++ Error: use of deleted function during constructor call of custom class

我有一个继承自 SystemC 的自定义 class producer class sc_module:

class producer: public sc_module {
    public:
        int counter;
        sc_in<bool> clock;
        sc_out<msg> out;
        int speed;

        producer(sc_module_name name, int speed) : 
            sc_module(name), 
            speed(speed) 
        {
            SC_HAS_PROCESS(producer);
            SC_METHOD(produce);

            sensitive << clock.pos();
            counter = 0;
        }

        void produce() {
            ...
        }

};

稍后在 SystemC sc_main-class 我想把一堆对象放在 std::vector<producer>:

std::vector<producer> producers;
for(int i = 0; i < numIn; i++){
    producers.at(i) = producer("Producer " + i, genSpeed); // <- Here the error occurs
}

这是编译器错误:

error: use of deleted function ‘producer& producer::operator=(producer&&)’
         producers.at(i) = producer("Producer " + i, genSpeed);
                                                             ^
dist.cpp:103:7: note: ‘producer& producer::operator=(producer&&)’ is implicitly deleted because the default definition would be ill-formed:
 class producer: public sc_module {
       ^~~~~~~~

为什么会出现这个错误?我该如何解决?

producer 没有移动赋值运算符。看样子,可能是因为sc_module没有。

您还有其他问题:

std::vector<producer> producers;
for(int i = 0; i < numIn; i++){
    producers.at(i) ....
}

这将创建一个 producers 的空向量,然后分配给该向量的第一个元素。问题是 没有这样的元素,因为你使用的是 at,你会得到一个异常。

方便的是,您可以通过以下方式同时解决这两个问题:

std::vector<producer> producers;
for(int i = 0; i < numIn; i++){
    producers.emplace_back("Producer " + i, genSpeed);
}

这将创建一个空向量,然后在其末尾构造一系列新的 producer。这确实取决于你有一个有效的移动构造函数。如果您没有有效的移动构造函数,我认为您会被卡住。

这仍然行不通,因为你会得到名为 "Producer "、"roducer "、"oducer " 等的生产者。将整数添加到字符串文字只会 return 指向文字第 n 个字符的指针。您需要的是使文字成为 std::string 文字,并将整数转换为文本。

    producers.emplace_back("Producer "s + std::to_string(i), genSpeed);

sc_module 到 implement/preserve SystemC 详尽语义的复制构造和赋值被禁用。

您应该使用 sc_vector 创建 sc_object 的集合。它是专门为解决此类设计问题而创建的。

我使用了 std::shared_ptrstd::vector 的最终解决方案:

using sharedProducerPointer = std::shared_ptr<producer>;
std::vector<sharedProducerPointer> producers;

//bind producers and distributor to input signals
for(int i = 0; i < numIn; i++) {
    std::string stringProducersName = "producer_" + std::to_string(i);
    const char* charProducersName = stringProducersName.c_str();

    sharedProducerPointer prod = sharedProducerPointer(new producer(charProducersName, genSpeed, numOut));
    prod->out.bind(inputSignals.at(i));
    dist.inputMsg.at(i).bind(inputSignals.at(i));
    prod->clock(inClock);

    producers.push_back(prod);
}