C 错误:在自定义类的构造函数呼叫期间使用已删除的函数

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

本文关键字:函数 删除 构造函数 错误 自定义 呼叫      更新时间:2023-10-16

我有一个自定义类producer,该类别从Systemc类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-类别的后期我想在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 {
       ^~~~~~~~

为什么发生错误?我该如何修复?

sc_module s禁用复制构造和分配,以实现/保存systemc详细语义。

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

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 s。这确实取决于您具有工作的移动构造函数。如果您没有工作的移动构造函数,我认为您会被卡住。

这仍然行不通,因为您会让制作人称为"生产者"," Roducer"," Oducer"等。将整数添加到字符字符串字面的字符串中,只会将指针返回到指针字面意思。您需要的是使文字成为std::string字面的文字,然后将整数转换为文本。

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

i我们的最终解决方案我们使用了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);
}