Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ MFC错误,如不指向';常数';无法绑定到非左值_C++_Templates_Linked List_Mfc - Fatal编程技术网

C++ 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

我想对静态值和动态值使用MFC类的
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);