队列底层c明确不支持vs2008

时间:2017-02-04 09:38:38

标签: c++11 queue

#include <queue>

struct model_shell_t 
{
    model_shell_t() {clear();}
    void    clear();
    void    Release() {clear(); model_pool._delete(this);}
    void    SetArgument(byte4 _type, byte4 _arg1, byte4 _arg2) 
    {
        switch( _type )
        {
        case 100:
            if( tail_enable && !_arg1 )
            {
                tail_deque.clear();//tail_queue.c.clear(); // Error C2248 Cannot access protected member of queue
            }
            tail_enable = _arg1;
            break;
        case 101:
            tail_interval = _arg1;
            tail_count = _arg2;
            break;
        }
    }

    queue<model_t>  tail_queue;
    byte4           tail_enable;
    byte4           tail_interval;
    byte4           tail_count;
    deque<model_t>  tail_deque;
};

另一个:

for( byte4 i = 0; i < ms->tail_queue.size(); i++ )
        {
            //ms->tail_queue.c[i].bind_model = &bind_ms->tail_queue.c[i];
            ms->tail_deque[i].bind_model = &bind_ms->tail_deque[i];
        }
  

错误C2248:'std :: queue&lt; _Ty&gt; :: c':无法访问受保护的成员   在类'std :: queue&lt; _Ty&gt;'

中声明

当我将解决方案从VS2003升级到VS2008时,我无法使用clear()函数。 我怎么用呢? 谢谢

编辑:在Igor Tandetnik的帮助下,我已经改变了

1 个答案:

答案 0 :(得分:0)

VS2003错了,VS2008是对的。底层容器应该是受保护的成员,不应该是可访问的。您的代码依赖于不符合要求的实现细节 - 实质上是依赖于已修复的编译器错误。

由于您显然需要直接访问元素,因此无论如何都要打破队列抽象。最简单的方法是直接使用std::deque,而不使用包装器。

如果由于某种原因你坚持使用std::queue,另一种方法是model_shell_t私下从中派生,而不是将其作为成员。这样它就可以直接访问c。虽然目前还不清楚为什么你想采取这样一条迂回路线来获得std::deque成员。