OMNeT++自定义cMessage添加vector<string>字段报错如何解决
解决方案
首选方案:直接使用OMNeT++消息语法内置的动态数组
这是最简单的适配方式,无需自定义外部类型和额外实现函数,OMNeT++ 5.6.x和6.x版本均原生支持:
你可以直接修改msg文件的消息定义,删除所有自定义IntVector、StrVector的相关代码,直接声明动态数组字段:
message sampleMessage extends cMessage { int SampleIntVector[]; string SampleStrVector[]; }
消息编译器会自动将上述两个字段映射为std::vector<int>和std::vector<std::string>类型,生成的setSampleIntVector()、setSampleStrVector()入参完全匹配你现有业务代码的参数类型,无需修改业务侧代码即可正常编译运行。
备选方案:保留自定义vector类型的适配方法
如果你确实需要保留自定义的vector类型封装,可以按以下步骤修改:
1. 修正msg文件的类型声明
补全必要的头文件引用、函数声明和类型特性标记:
cplusplus {{ #include <vector> #include <string> #include <iostream> #include "omnetpp.h" typedef std::vector<int> IntVector; typedef std::vector<std::string> StrVector; // 提前声明消息编译器需要用到的全局函数 std::ostream& operator<<(std::ostream& os, const StrVector& v); void parsimPack(omnetpp::cCommBuffer *b, const StrVector& v); void parsimUnpack(omnetpp::cCommBuffer *b, StrVector& v); }}; class IntVector { @existingClass; @supportsAssignment; @supportsCopyConstructor; @supportsComparison; }; class StrVector { @existingClass; @supportsAssignment; @supportsCopyConstructor; @supportsComparison; }; message sampleMessage extends cMessage { IntVector SampleIntVector; StrVector SampleStrVector; }
2. 实现全局辅助函数
在任意你的项目的cc文件中实现上述声明的三个函数,用于消息的日志输出和序列化:
#include <vector> #include <string> #include "omnetpp.h" std::ostream& operator<<(std::ostream& os, const StrVector& v) { os << "["; for (size_t i = 0; i < v.size(); ++i) { if (i != 0) os << ", "; os << "\"" << v[i] << "\""; } os << "]"; return os; } void parsimPack(omnetpp::cCommBuffer *b, const StrVector& v) { size_t len = v.size(); b->pack(len); for (size_t i = 0; i < len; ++i) { b->pack(v[i].c_str()); } } void parsimUnpack(omnetpp::cCommBuffer *b, StrVector& v) { size_t len; b->unpack(len); v.resize(len); for (size_t i = 0; i < len; ++i) { v[i] = b->unpackString(); } }
如果你的项目不需要用到并行仿真功能,可以省略parsimPack和parsimUnpack的实现,仅实现operator<<即可解决编译错误。
错误原因说明
- OMNeT++ 5.6.x版本的
<<运算符歧义错误:消息编译器生成代码时需要打印字段内容,但找不到std::vector<std::string>对应的输出运算符实现,导致编译失败。 - OMNeT++ 6.x版本的类型转换错误:你声明的
StrVector没有加足够的特性标记,消息编译器默认将字符串类容器识别为char*数组,生成的setter入参为std::vector<char*>,和你传入的std::vector<std::string>类型不匹配。
内容的提问来源于stack exchange,提问作者Atybzz
相关产品推荐
相关产品推荐

