Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 强制转换由迭代器指向的对象_C++_Inheritance_Casting_Iterator - Fatal编程技术网

C++ 强制转换由迭代器指向的对象

C++ 强制转换由迭代器指向的对象,c++,inheritance,casting,iterator,C++,Inheritance,Casting,Iterator,我有一个多集容器: multiset<IMidiMsgExt, IMidiMsgExtComp> queuedNotes; 下一步:我将一些IMidiMsgExt对象存储在queuedNotes multiset中,其中包括: IMidiMsgExt* noteOff = new IMidiMsgExt; noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0); queuedNotes.insert(*noteOff); 现在,我

我有一个多集容器:

multiset<IMidiMsgExt, IMidiMsgExtComp> queuedNotes;
下一步:我将一些IMidiMsgExt对象存储在queuedNotes multiset中,其中包括:

IMidiMsgExt* noteOff = new IMidiMsgExt;
noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0);
queuedNotes.insert(*noteOff);
现在,我需要使用一个名为SendMidiMsgIMidiMsg*pMsg的函数,该函数将IMidiMsg类型作为输入,将我的对象IMidiMsgExt发送给它

我将列表中的第一个对象提取到迭代器:

auto midiMessage = queuedNotes.begin();
但当我尝试使用SendMidImg时:

它说没有合适的从std::_Tree_const_迭代器到imidmsg*的转换函数

我错在哪里?我应该使用动态铸造吗

midiMessage的类型为std::multiset::iterator。并且它不能转换为您的IMidiMsgExt类型。迭代器是一个行为类似于指针的对象,因此可以使用解引用操作符*来获取它所指向的对象。您也不需要将派生对象强制转换为其基对象,这是隐式完成的。您只需获取迭代器指向的地址,即可获得指向IMidiMsgExt的指针:

&*MIDI消息的快速分解:

编辑: 关于常量迭代器错误。您的函数SendMidiMsg需要一个非常量指针-它表示要编辑消息。multiset不允许更改元素

您可以复制消息,然后调用SendMidiMsg。如果不再需要容器中的消息,也可以在之后将其删除

auto msg = *midiMessage;
SendMidiMsg(&msg);
queuedNotes.erase(midiMessage);
注意:程序中似乎存在内存泄漏。你用new创建消息,我看不到任何删除和释放内存的调用

IMidiMsgExt* noteOff = new IMidiMsgExt;
noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0);
queuedNotes.insert(*noteOff);
midiMessage的类型为std::multiset::iterator。并且它不能转换为您的IMidiMsgExt类型。迭代器是一个行为类似于指针的对象,因此可以使用解引用操作符*来获取它所指向的对象。您也不需要将派生对象强制转换为其基对象,这是隐式完成的。您只需获取迭代器指向的地址,即可获得指向IMidiMsgExt的指针:

&*MIDI消息的快速分解:

编辑: 关于常量迭代器错误。您的函数SendMidiMsg需要一个非常量指针-它表示要编辑消息。multiset不允许更改元素

您可以复制消息,然后调用SendMidiMsg。如果不再需要容器中的消息,也可以在之后将其删除

auto msg = *midiMessage;
SendMidiMsg(&msg);
queuedNotes.erase(midiMessage);
注意:程序中似乎存在内存泄漏。你用new创建消息,我看不到任何删除和释放内存的调用

IMidiMsgExt* noteOff = new IMidiMsgExt;
noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0);
queuedNotes.insert(*noteOff);

但它表示:const-imidmsgent*类型的参数与imidmsg*@paizza类型的参数不兼容,后者表示queuedNotes.begin返回一个const_迭代器。如果取消引用常量迭代器,它将返回对对象的常量引用。您的SendMidiMsg需要一个非常量指针。您的程序中有一个概念错误。您正在尝试修改您所说的不应修改的内容。我无法更改SendMidiMsg,因为它是我将使用的框架内的一个方法。唯一的方法是更改迭代器返回类型。但也有:我不能编辑多集列表。我需要换集装箱吗?有些东西存储并返回一个非常量元素?不是。问题是为什么会得到一个常量迭代器。您必须具有对queuedNotes的常量引用。如果在调用sendmidimg之前显示代码,这会有所帮助。InRequesting位是在调用begin之前从何处获取queuedNotes。在begin之前,我只需检查:while queuedNotes.size>0。而不是自动和那个功能。我声明了多组队列节点;在.h文件中。但它表示:const-imidmsgent*类型的参数与imidmsg*@paizza类型的参数不兼容,后者表示queuedNotes.begin返回一个const_迭代器。如果取消引用常量迭代器,它将返回对对象的常量引用。您的SendMidiMsg需要一个非常量指针。您的程序中有一个概念错误。您正在尝试修改您所说的不应修改的内容。我无法更改SendMidiMsg,因为它是我将使用的框架内的一个方法。唯一的方法是更改迭代器返回类型。但也有:我不能编辑多集列表。我需要换集装箱吗?有些东西存储并返回一个非常量元素?不是。问题是为什么会得到一个常量迭代器。您必须具有对queuedNotes的常量引用。如果在调用sendmidimg之前显示代码,这会有所帮助。InRequesting位是在调用begin之前从何处获取queuedNotes。在begin之前,我只需检查:while queuedNotes.size>0。而不是自动和那个功能。我声明了多组队列节点;在.h文件中。
  variable    -     type
midiMessage   - std::multiset::iterator
*midiMessage  - IMidiMsgExt
&*midiMessage - IMidiMsgExt*
auto msg = *midiMessage;
SendMidiMsg(&msg);
queuedNotes.erase(midiMessage);
IMidiMsgExt* noteOff = new IMidiMsgExt;
noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0);
queuedNotes.insert(*noteOff);