std :: CAtlArray队列错误

时间:2014-01-21 16:19:52

标签: c++ visual-c++ stl atl

我有一个推送CAtlArray的队列,但它返回

cannot access private member declared in class 'ATL::CAtlArray<E>' with

[

 E=BYTE

]

我的代码是

      CAtlArray<BYTE> mybuffer; //Fulled with data somewhere
      std::queue< CAtlArray<BYTE> > myqueue;
      myqueue.push(mybuffer);

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,大多数ATL容器(至少我使用过的所有容器,但我不能以100%保证说明这一点)不提供复制构造函数,而stl容器不是侵入性保留所包含对象的副本,例如在为push()生成模板代码时,编译器无法调用复制构造函数,您将收到错误。

如果你只需要一个列表容器,你可以使用另一个ATL容器来存储ATL数组,它不是世界上最漂亮的代码,因为ATL也使用了拷贝构造函数并且在ATL容器中插入另一个ATL容器并不简单,但这证明了如何实现您的需求。

#include <atlcoll.h>
#include <queue>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    CAtlArray<BYTE> buffer;
    buffer.Add('a');
    buffer.Add('b');
    buffer.Add('c');
    CAtlList<CAtlArray<BYTE>> list;
    list.GetAt(list.AddTail()).Copy(buffer);
    CAtlArray<BYTE> queueHead;
    queueHead.Copy(list.GetAt(list.GetHeadPosition()));
    list.RemoveHeadNoReturn();
    std::cout << queueHead.GetAt(0) << " " << queueHead.GetAt(1) << " " << queueHead.GetAt(2);
    return 0;
}

如果STL是必须的,您需要专门化模板或寻求其他方法。