我有一个自定义类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 {
^~~~~~~~
为什么会出现错误?我该如何解决?
答案 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_ptr
和std::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);
}