C++在使用模板类时解析错误



我有一个学校作业,我必须编写一个模板类,该类将存储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 = ...;

相关内容

  • 没有找到相关文章

最新更新