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

时间:2016-12-14 17:44:26

标签: c++ constructor compiler-errors systemc

我有一个自定义类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 {
       ^~~~~~~~

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

3 个答案:

答案 0 :(得分:4)

sc_module禁用复制构造和赋值,以实现/保留SystemC精化语义。

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

答案 1 :(得分:2)

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”等的生产者。在字符串文字中添加一个整数只会返回指向第n个字符的指针。文字。你需要的是使文字成为std::string文字,并将整数转换为文本。

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

答案 2 :(得分:0)

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