我想使用基于Omnet ++的容器cQueue作为优先级队列。
正如API参考和手册中所述-我需要对其进行定义
如下:
cQueue queue("Name of queue", someCompareFunc)

someCompareFunc的类型为CompareFunc时,omnet将其定义为:
typedef int (*CompareFunc)(cObject *a, cObject *b);

因此,我想实现此比较功能,但没有设法编写可编译的东西。
我承认我已经有一段时间没有使用函数指针了,但是经过一番研究,我认为我确实理解并使用eclipse IDE(c ++)编写了一些测试代码。

我正在尝试在simpleModule file.cc上编写代码。
因此,对于我以“常规方式”在头文件中声明的每个函数,在.cc文件中,我需要在函数名称之前添加带有“ ::”的模块名称。
所以我在头文件中声明:
int compareByNodes (cObject *a, cObject *b);

在.cc文件中:

int JobScheduler::compareByNodes (cObject *a, cObject *b){
       return 1;
    };


我第一次定义cQueue的尝试是:

cQueue queue("job_Buffer",&compareByNodes);


但是我收到一个编译错误:'compareByNodes'未在此范围内声明。
因此,我认为它必须与缺少的“ JobScheduler ::”有关。
第二次尝试是:

CompareFunc tmp = (CompareFunc)&JobScheduler::compareByNodes;
cQueue queue("job_Buffer",tmp);


这次我的错误是:
“这条线上有多个标记
    -在这种情况下
    -从“ int(JobScheduler ::)(omnetpp :: cObject,omnetpp :: cObject *)”转换为“ omnetpp :: CompareFunc {aka int()
     (omnetpp :: cObject,omnetpp :: cObject *)}’[-Wpmf-conversions]“

在“&”号后面加上括号也无济于事。

如果我可以使用Omnet的这种方法,那真的很有帮助,我想我遗漏了一些东西,因为它是该软件定义明确的“功能”。
我还尝试过搜索这些主题,在Google网上论坛部分中进行了搜索,但未找到任何答案。
希望有帮助

最佳答案

尝试将比较方法声明为静态方法。
例如:

//...
class Txc1 : public cSimpleModule {
  protected:
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;

  public:
    static int MyCompareFunc (cObject *a, cObject *b);
};

Define_Module(Txc1);

int Txc1::MyCompareFunc (cObject *a, cObject *b) {
    return 1;
}

void Txc1::initialize() {
    cQueue q1("queue1", MyCompareFunc);
    // ...
}

07-28 12:04