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_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);
}
我有一个继承自 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_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);
}