我有一个推送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);
答案 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是必须的,您需要专门化模板或寻求其他方法。