MFC错误,如不是'const'的引用,不能绑定到非左值

时间:2017-08-04 13:32:25

标签: c++ templates linked-list mfc

我想将MFC类的CList用于静态值和动态值。 我猜&d1是指向d1值的指针,所以不应该有错误,但有。 我理解错误来自const与否之间的差异,它不能是l值。但我想将它用作CList<DATA*, DATA*&>的条目。

错误:

error C2664: 'struct __POSITION *__thiscall CList<struct DATA *,struct DATA 
* &>::AddTail(struct DATA *& )' : cannot convert parameter 1 from 'struct 
DATA *' to 'struct DATA *& '

然后我可以像下面那样展示这个。 还有另一种方法可以避免这种错误吗? 提前谢谢。

#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;
}

1 个答案:

答案 0 :(得分:2)

struct DATA
{
    int n;
    CString id;
    CString time;
};

...
    CList<DATA*, DATA*&> list2;

我认为您使用的是CList错误。你应该做的是:

CList<DATA> myList;

// Create and populate your data...
DATA d1;
d1.n = 1;
...

// Add new node to the list
myList.AddTail(d1);

请注意更简单的语法CList<DATA>。链表由具有嵌入式DATA对象的节点构成。为什么需要另一个包含指针DATA个对象的节点的间接?这对缓存不太友好(遵循那些指向数据)并且效率更低。

另请注意,如果您只使用CList<DATA>,则根据ARG_TYPE模板声明({{},默认情况下会将第二个模板参数const DATA&正确推断为CList。 1}},TYPE = DATA):

ARG_TYPE = const DATA&

修改

如果您确实要将指针存储到template<class TYPE, class ARG_TYPE = const TYPE&> class CList : public CObject 节点中的DATA,那么您可以执行以下操作:

CList