【发布时间】:2018-03-21 05:43:33
【问题描述】:
我正在尝试在 c++ 类中使用 MQ 系列的 C API 中的几种结构。这是 IBM 的其中一种结构的文档 https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.1.0/com.ibm.mq.doc/fr13840_.htm 问题似乎是宏变量,例如 MQOD_DEFAULT。全局初始化结构时(在任何函数或方法之外)初始化工作。但是在函数或方法中,我收到如下错误:
no match for >>operator=<< operand types are >>MQOD {aka tagMQOD&)}<< and >>brace-enclosed initializer list><<)
使用 gcc 4.8 可以正常编译:
MQOD od = { MQOD_DEFAULT };
在方法内部抛出编译错误 no match for operator=...:
void MyClass::Methode()
{
MQOD od = { MQOD_DEFAULT };
}
MQOD_DEFAULT 被 IBM 描述为宏变量:
#define MQOD_DEFAULT {MQOD_STRUCT_ID_ARRAY},\
MQOD_VERSION_1,\
MQOT_Q,\
{""},\
...
...
我在 IBM 的开发人员文档(第 77 页)中找到了更多信息:ftp://public.dhe.ibm.com/software/integration/wmq/docs/V7.5/PDFs/wmq75.develop.pdf
要初始化此类结构中的字段,建议使用以下技术:
1. 使用适当的 MQxxx_DEFAULT 宏变量来声明结构的实例
初始化结构。此实例成为其他实例的模型:
MQMD ModelMsgDesc = {MQMD_DEFAULT};
/* declare model instance */
在声明中编码 static 或 auto 关键字以赋予模型实例静态或动态
生命周期,根据需要。
2. 使用 calloc 或 malloc 函数获取结构的动态实例的存储:
PMQMD InstancePtr;
InstancePtr = malloc(sizeof(MQMD));
/* get storage for dynamic instance */
3。使用 memcpy 函数将模型实例复制到动态实例中:
memcpy(InstancePtr,&ModelMsgDesc,sizeof(MQMD));
/* initialize dynamic instance */
但是 InstancePtr = malloc(sizeof(MQMD));给了我同样的错误“no operator="
解决这个问题的最佳方法是什么?
【问题讨论】:
-
初始化 (
type x = value;) 不同于赋值 (x = value;)。对operator=的引用表明您正在尝试分配一个“大括号括起来的初始值设定项列表”。就是不行。 -
您是使用 C++ 还是 C 进行编程?请不要同时使用这两个标签——它们完全不同。
-
如前所述,我使用 C++ 编程,但使用 IBM 的 MQ C API。我认为这是跨越国界的原因。但我明白你的意思。我将删除 C 标记。
-
@BoPersson 好的,但为什么会有不同的行为?为什么全局初始化时我没有收到该错误?分别为什么我在函数或方法中初始化时会得到它?
-
operator=不参与初始化,所以你可能没有做你认为你正在做的事情。如果你展示了一些代码......