初始化列表构造和静态断言
Initializer List construction and static assert
我正在尝试让我的 class 支持初始化列表。
#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}};
我正在尝试让我的 class 支持初始化列表。
#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}};