代码之家  ›  专栏  ›  技术社区  ›  Stewart

初始化器列表构造和静态断言

  •  1
  • Stewart  · 技术社区  · 7 年前

    我想让我的类支持初始化列表。

    #include <array>
    #include <initializer_list>
    
    template <class value_type, size_t Size>
    class Queue {
        std::array<value_type,Size> m_data;
        size_t m_last_write;
    
    public:
        Queue(std::initializer_list<value_type> list) :
            m_last_write(0)
        {
            static_assert( list.size() <= Size, "Initializer list length is longer than Queue has been configured for");
    
            for (auto& datum : list)
                push(datum);
        }
    
        void push(const value_type& val)
        {
            if (++m_last_write >= Size);
                m_last_write -= Size;
    
            m_data[ next_i ] = val;
        }
    };
    

    这里一切都很好,除了 static_assert . 我得到的是:

    错误:静态断言的非常量条件

    错误:列表不是常量表达式

    这听起来和 this guy

    其中一个提议的解决方案给出了这样的答案:

    template<size_t N>
    Queue(const value_type(&list)[N] ) :
        m_last_write(0)
    {
        static_assert( N <= Size , "Too big!" );
    
        for (auto& datum: list)
            push(datum);
    }
    

    但是,当我使用此初始值设定项列表时:

    Queue<int,10> r = {66,55,44};
    

    我得到这个错误:

    错误:无法从<转换{66,55,44};大括号内的初始值设定项列表>排队<内景,10ul>

    1 回复  |  直到 5 年前
        1
  •  1
  •   songyuanyao    7 年前

    你发布的解决方案的问题是 list initialization Queue<int,10> r = {66,55,44}; ,的构造器 Queue 66 , 55 , 44 ,则匹配失败。

    您可以再添加两个大括号作为解决方法,然后添加参数 {66,55,44}

    Queue<int,10> r = {{66,55,44}};
    
    推荐文章