我有一个学校作业,我必须编写一个模板类,该类将存储int列表中的最小值。运行它时,我会遇到解析错误,但我不明白为什么。有人能解释一下我为什么会出现这些错误吗?
ListMin.hpp
template <int ... list>
class ListMin;
template <int first, int ... others>
class ListMin <first, others ...> {
public:
enum : long { value = std::min(first, ListMin<others>::value) };
};
template <int first>
class ListMin <first> {
public:
enum : long { value = first };
};
Main.cpp
std::cout << "min( [ 1, -5, 3 ] ) = " << ListMin< 1, -5, 3 >::value << std::endl;
错误
ListMin.hpp:4: parse error before `...'
ListMin.hpp:7: parse error before `...'
ListMin.hpp:14: parse error before `<'
提前感谢
第一个问题:需要扩展others
包。
Clang告诉它在前面:
<source>:9:27: error: enumerator value contains unexpanded parameter pack 'others'
enum : long { value = std::min(first, ListMin<others>::value) };
^ ~~~~~~
解决方案:
enum : long { value = std::min(first, ListMin<others...>::value) };
// ^~~
第二个问题:std::min
要求参数具有相同的类型。(目前有int
与未命名的enum
(。
enum : long { value = std::min(first, int(ListMin<others...>::value)) };
// ^~~~ ^
更好的解决方案是使用std::min({1, 2, 3})
,这是自C++14以来的constexpr
(就像您已经使用的std::min(1, 2)
一样(。
或者至少,删除过时的C样式未命名枚举,并将其替换为static constexpr int value = ...;
。