C++ MFC错误,如不指向';常数';无法绑定到非左值
我想对静态值和动态值使用MFC类的C++ MFC错误,如不指向';常数';无法绑定到非左值,c++,templates,linked-list,mfc,C++,Templates,Linked List,Mfc,我想对静态值和动态值使用MFC类的CList。 我猜&d1是指向d1值的指针,所以不应该有错误,但确实有。 我知道错误来自于const与否之间的差异,它不能是l值。但我想将其用作CList的条目 错误: error C2664: 'struct __POSITION *__thiscall CList<struct DATA *,struct DATA * &>::AddTail(struct DATA *& )' : cannot convert paramete
CList
。
我猜&d1
是指向d1
值的指针,所以不应该有错误,但确实有。
我知道错误来自于const
与否之间的差异,它不能是l值。但我想将其用作CList
的条目
错误:
error C2664: 'struct __POSITION *__thiscall CList<struct DATA *,struct DATA
* &>::AddTail(struct DATA *& )' : cannot convert parameter 1 from 'struct
DATA *' to 'struct DATA *& '
错误C2664:'struct\uuuuu POSITION*\uuuuu thiscall CList::AddTail(struct DATA*&)':无法将参数1从'struct'转换
数据*”到“结构数据*&”
然后我可以像下面这样简单地展示这个。
有没有其他方法可以避免这个错误?
提前谢谢
#include "stdafx.h"
#include <afxtempl.h>
struct DATA
{
int n;
CString id;
CString time;
};
DATA d1;
int main()
{
CList<DATA*, DATA*&> list2;
d1.n = 1;
//error here
list2.AddTail((DATA*)&d1);
//no error
DATA* pd1;
pd1 = &d1;
list2.AddTail(pd1);
return 1;
}
#包括“stdafx.h”
#包括
结构数据
{
int n;
CString-id;
启动时间;
};
数据d1;
int main()
{
CList列表2;
d1.n=1;
//这里出错
清单2.AddTail((数据*)和d1);
//无误
数据*pd1;
pd1=&d1;
清单2.AddTail(pd1);
返回1;
}
注意更简单的语法CList
。链表由具有嵌入数据对象的节点组成。为什么需要另一个包含指向DATA
对象指针的节点间接寻址?这对缓存不太友好(遵循指向数据的缓存),而且效率更低
还请注意,如果只使用CList
,则根据CList
模板声明(TYPE=DATA
,ARG\u TYPE=const DATA&
),默认情况下,第二个模板参数ARG\u TYPE
正确推断为const DATA&
):
用自动存储器存储变量的地址是一种糟糕的设计,可能会导致问题(如d1
超出范围)。为什么要将数据*
强制转换为数据*
?在列表2.AddTail((数据*)&d1)中不执行操作强制转换代码>以上代码是显示此错误的简单代码。我只想在CList中保存一个固定内存,比如静态区域或自动区域,用于动态内存。当然,我会保证这些条目不会在CList拿着它们的时候受伤。是的,如果没有施法,我也会有同样的错误。清单2.AddTail(&d1);谢谢,我知道你们的意思,但若数据太大,那个么它应该需要一定的内存管理。当然,将CList更改为CList可以解决这个问题,但我只想知道使用CList,是否有其他方法可以避免此错误。@semenbari我添加了一个包含指向数据指针的列表节点的编辑。@semenbari您不需要使代码复杂化,也不需要通过显式定义ARG\u TYPE
引入错误。只需使用CList
并接受ARG\u类型的默认值即可。
struct DATA
{
int n;
CString id;
CString time;
};
...
CList<DATA*, DATA*&> list2;
CList<DATA> myList;
// Create and populate your data...
DATA d1;
d1.n = 1;
...
// Add new node to the list
myList.AddTail(d1);
template<class TYPE, class ARG_TYPE = const TYPE&>
class CList : public CObject
CList<DATA*> myPtrList;
DATA d1;
d1.n = 1;
...
myPtrList.AddTail(&d1);