gpt4 book ai didi

c++ - 初始化列表构造和静态断言

转载 作者:行者123 更新时间:2023-11-30 04:56:13 24 4
gpt4 key购买 nike

我正在尝试让我的类支持初始化列表。

#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 之外,这里的一切都运行良好。我从哪里得到:

error: non-constant condition for static assertion

error: ‘list’ is not a constant expression

这听起来像 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};

我收到这个错误:

error: could not convert ‘{66, 55, 44}’ from < brace-enclosed initializer list> to Queue< int, 10ul>

最佳答案

您发布的解决方案问题是在 list initialization ,即 Queue<int,10> r = {66,55,44}; , Queue 的构造函数在重载决议中考虑匹配三个参数 66 , 55 , 44 , 则匹配失败。

作为解决方法,您可以再添加两个大括号,然后添加参数 {66,55,44}将用作匹配构造函数参数的一个参数;然后它匹配接受一个数组并按预期工作的那个。

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

关于c++ - 初始化列表构造和静态断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52698328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com