如何为每条消息发送一个 "struct" 向量?
How to send a "struct" vector per message?
我正在尝试为每条消息发送一个 "struct" 的矢量,但是在定义消息字段时生成了以下错误:
Entering directory '/home/veins/workspace.omnetpp/veins/src'
veins/modules/application/clustertraci/ClusterTraCI11p.cc
veins/modules/application/clustertraci/ClusterTraCI11p.cc:160:40: error: no viable conversion from 'vector' to 'const vector'
frameOfUpdate->setUpdateTable(updateTable);
我看了OMnet++手册的第六章,但我不明白如何解决这个问题。
Implementation with error
消息代码(MyMessage.msg):
cplusplus {{
#include "veins/base/utils/Coord.h"
#include "veins/modules/messages/BaseFrame1609_4_m.h"
#include "veins/base/utils/SimpleAddress.h"
#include <iostream>
#include <vector>
struct updateTableStruct {
int car;
char update;
};
typedef std::vector<updateTableStruct> UpdateTable;
}}
namespace veins;
class BaseFrame1609_4;
class noncobject Coord;
class noncobject UpdateTable;
class LAddress::L2Type extends void;
packet ClusterMessageUpdate extends BaseFrame1609_4 {
LAddress::L2Type senderAddress = -1;
int serial = 0;
UpdateTable updateTable;
MyApp.cc:
void ClusterTraCI11p::handleSelfMsg(cMessage* msg) {
if (ClusterMessage* frame = dynamic_cast<ClusterMessage*>(msg)) {
ClusterMessageUpdate* frameOfUpdate = new ClusterMessageUpdate;
populateWSM(frameOfUpdate, CH2);
frameOfUpdate->setSenderAddress(myId);
frameOfUpdate->setUpdateTable(updateTable);
sendDelayedDown(frameOfUpdate, uniform(0.1, 0.02));
}
else {
DemoBaseApplLayer::handleSelfMsg(msg);
}
}
MyApp.h中分析的部分代码:
struct updateTableStruct {
int car;
char update;
};
typedef std::vector<updateTableStruct> UpdateTable;
UpdateTable updateTable;
您遇到了类型不匹配:在 MyApp.h
中您定义了类型 UpdateTable
,而您在 MyMessage.h
中也是如此。虽然这两种类型具有相同的内容并且 appear 具有相同的名称,但我认为实际情况并非如此:一种类型是 UpdateTable
(在全局范围内定义根据您的消息生成的文件),另一个是 MyApp::UpdateTable
(在您的应用程序中定义,假设您在显示的代码中省略了 class 定义)。
因此,类型不同,不能相互隐式转换。在这种情况下,这可能看起来有点 counter-intuitive,因为它们具有完全相同的定义,但它们没有相同的名称。在以下示例中显示了推理:共享相同定义的两种不同类型不一定可以隐式转换为彼此:
struct Coordinate {
int x;
int y;
};
struct Money {
int dollars;
int cents;
};
void test() {
Coordinate c;
Money m = c;
}
给出以下错误信息:
test.cc:13:8: error: no viable conversion from 'Coordinate' to 'Money'
Money m = c;
^ ~
test.cc:6:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'Coordinate' to 'const Money &' for 1st argument
struct Money {
^
test.cc:6:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'Coordinate' to 'Money &&' for 1st argument
struct Money {
^
1 error generated.
编辑:
您的特定问题的解决方案是删除其中一个定义并在使用时包含其余定义,因此您可以从消息中删除 UpdateTable
定义并包含 App header,或者删除来自 App 的 UpdateTable
定义并改为包含消息。
我正在尝试为每条消息发送一个 "struct" 的矢量,但是在定义消息字段时生成了以下错误:
Entering directory '/home/veins/workspace.omnetpp/veins/src' veins/modules/application/clustertraci/ClusterTraCI11p.cc veins/modules/application/clustertraci/ClusterTraCI11p.cc:160:40: error: no viable conversion from 'vector' to 'const vector' frameOfUpdate->setUpdateTable(updateTable);
我看了OMnet++手册的第六章,但我不明白如何解决这个问题。
Implementation with error
消息代码(MyMessage.msg):
cplusplus {{
#include "veins/base/utils/Coord.h"
#include "veins/modules/messages/BaseFrame1609_4_m.h"
#include "veins/base/utils/SimpleAddress.h"
#include <iostream>
#include <vector>
struct updateTableStruct {
int car;
char update;
};
typedef std::vector<updateTableStruct> UpdateTable;
}}
namespace veins;
class BaseFrame1609_4;
class noncobject Coord;
class noncobject UpdateTable;
class LAddress::L2Type extends void;
packet ClusterMessageUpdate extends BaseFrame1609_4 {
LAddress::L2Type senderAddress = -1;
int serial = 0;
UpdateTable updateTable;
MyApp.cc:
void ClusterTraCI11p::handleSelfMsg(cMessage* msg) {
if (ClusterMessage* frame = dynamic_cast<ClusterMessage*>(msg)) {
ClusterMessageUpdate* frameOfUpdate = new ClusterMessageUpdate;
populateWSM(frameOfUpdate, CH2);
frameOfUpdate->setSenderAddress(myId);
frameOfUpdate->setUpdateTable(updateTable);
sendDelayedDown(frameOfUpdate, uniform(0.1, 0.02));
}
else {
DemoBaseApplLayer::handleSelfMsg(msg);
}
}
MyApp.h中分析的部分代码:
struct updateTableStruct {
int car;
char update;
};
typedef std::vector<updateTableStruct> UpdateTable;
UpdateTable updateTable;
您遇到了类型不匹配:在 MyApp.h
中您定义了类型 UpdateTable
,而您在 MyMessage.h
中也是如此。虽然这两种类型具有相同的内容并且 appear 具有相同的名称,但我认为实际情况并非如此:一种类型是 UpdateTable
(在全局范围内定义根据您的消息生成的文件),另一个是 MyApp::UpdateTable
(在您的应用程序中定义,假设您在显示的代码中省略了 class 定义)。
因此,类型不同,不能相互隐式转换。在这种情况下,这可能看起来有点 counter-intuitive,因为它们具有完全相同的定义,但它们没有相同的名称。在以下示例中显示了推理:共享相同定义的两种不同类型不一定可以隐式转换为彼此:
struct Coordinate {
int x;
int y;
};
struct Money {
int dollars;
int cents;
};
void test() {
Coordinate c;
Money m = c;
}
给出以下错误信息:
test.cc:13:8: error: no viable conversion from 'Coordinate' to 'Money'
Money m = c;
^ ~
test.cc:6:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'Coordinate' to 'const Money &' for 1st argument
struct Money {
^
test.cc:6:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'Coordinate' to 'Money &&' for 1st argument
struct Money {
^
1 error generated.
编辑:
您的特定问题的解决方案是删除其中一个定义并在使用时包含其余定义,因此您可以从消息中删除 UpdateTable
定义并包含 App header,或者删除来自 App 的 UpdateTable
定义并改为包含消息。