单一类型编译时间列表:concat with clang
Single type compile time list: concat with clang
我正在为我的一个项目使用 "fixed type compile-time list"。最近我测试了这个项目与不同编译器的兼容性,我注意到 clang (3.8) 无法编译我的实现。
出现此错误:
error: expected expression return
List<T, sizeof...(Ints1) + sizeof...(Ints2)>(this->get<Ints1>()..., rhs.get<Ints2>()...);
^
以下部分摘自我实现的编译时列表:
template<class T, size_t TNum>
class List;
template<class T, size_t TNum>
class List: public List<T, TNum - 1>
{
protected:
T data;
template<size_t ... Ints1, size_t ... Ints2>
constexpr List<T, sizeof...(Ints1) + sizeof...(Ints2)> _concat(const List<T, sizeof...(Ints2)> rhs, std::index_sequence<Ints1...>, std::index_sequence<Ints2...>) const
{
return List<T, sizeof...(Ints1) + sizeof...(Ints2)>(this->get<Ints1>()..., rhs.get<Ints2>()...);
}
template<class ... TArgs>
constexpr List(T d, TArgs&& ... arg)
: List<T, TNum - 1>(std::forward<TArgs>(arg)...), data(d)
{
static_assert(TNum != sizeof...(TArgs), "Number of arguements and list size does not match!");
}
template<size_t TNum2, typename Indices1 = std::make_index_sequence<TNum>, typename Indices2 = std::make_index_sequence<TNum2>>
constexpr List<T, TNum + TNum2> concat(const List<T, TNum2>& rhs) const
{
return this->_concat(rhs, Indices1(), Indices2());
}
template<size_t TI>
constexpr T get() const
{
static_assert(TI < TNum, "Element out of valid range!");
static_assert(TI >= 0, "Element out of valid range!");
return static_cast<List<T, TNum - TI> >(*this).get();
}
};
此外,此示例中缺少 TNum=1 和 TNum=0 的两个特殊化。如果需要我可以添加它们
我希望你能帮助我找到造成这个问题的错误
编辑:
感谢 Jarod42 的回答。在他的帮助下,我发现了这个:Where and why do I have to put the "template" and "typename" keywords? 这进一步解释了事情。
template
在 rhs.get<Ints2>()
中缺失:
应该是
rhs.template get<Ints2>()
我正在为我的一个项目使用 "fixed type compile-time list"。最近我测试了这个项目与不同编译器的兼容性,我注意到 clang (3.8) 无法编译我的实现。 出现此错误:
error: expected expression return
List<T, sizeof...(Ints1) + sizeof...(Ints2)>(this->get<Ints1>()..., rhs.get<Ints2>()...);
^
以下部分摘自我实现的编译时列表:
template<class T, size_t TNum>
class List;
template<class T, size_t TNum>
class List: public List<T, TNum - 1>
{
protected:
T data;
template<size_t ... Ints1, size_t ... Ints2>
constexpr List<T, sizeof...(Ints1) + sizeof...(Ints2)> _concat(const List<T, sizeof...(Ints2)> rhs, std::index_sequence<Ints1...>, std::index_sequence<Ints2...>) const
{
return List<T, sizeof...(Ints1) + sizeof...(Ints2)>(this->get<Ints1>()..., rhs.get<Ints2>()...);
}
template<class ... TArgs>
constexpr List(T d, TArgs&& ... arg)
: List<T, TNum - 1>(std::forward<TArgs>(arg)...), data(d)
{
static_assert(TNum != sizeof...(TArgs), "Number of arguements and list size does not match!");
}
template<size_t TNum2, typename Indices1 = std::make_index_sequence<TNum>, typename Indices2 = std::make_index_sequence<TNum2>>
constexpr List<T, TNum + TNum2> concat(const List<T, TNum2>& rhs) const
{
return this->_concat(rhs, Indices1(), Indices2());
}
template<size_t TI>
constexpr T get() const
{
static_assert(TI < TNum, "Element out of valid range!");
static_assert(TI >= 0, "Element out of valid range!");
return static_cast<List<T, TNum - TI> >(*this).get();
}
};
此外,此示例中缺少 TNum=1 和 TNum=0 的两个特殊化。如果需要我可以添加它们
我希望你能帮助我找到造成这个问题的错误
编辑: 感谢 Jarod42 的回答。在他的帮助下,我发现了这个:Where and why do I have to put the "template" and "typename" keywords? 这进一步解释了事情。
template
在 rhs.get<Ints2>()
中缺失:
应该是
rhs.template get<Ints2>()