[英]Ambiguous call on overloaded variadic template function
我从 github 下载了一个 C++ 库来支持多维数组,当我使用 GCC8.2.0 构建它时,编译器遇到一条消息,说过载 ZC1C425268E68385F14AB5074C17A9 考虑以下代码:
// basic function, set the length i for the dimension D
template<int Rank,int D>
void set_array(std::array<int,Rank>& A,int i)
{
A[D] = i;
}
// function with parameter pack, set the length for all dimensions recursively
template<int Rank,int D,typename... indices>
void set_array(std::array<int,Rank>& A,int i,indices... idx)
{
A[D] = i;
set_array<Rank,D+1>(A,idx...);
}
// class calls set_array in allocation
template<typename T,int Rank>
class MultiArray
{
private:
std::array<int,Rank> _dim = {{0}};
template<typename... indices>
void allocate(indices... idx) {
static_assert(sizeof...(idx) == Rank,
"NUMBER OF INDICES PASSED TO ALLOCATE DOES NOT MATCH RANK OF ARRAY");
set_array<Rank,0>(_dim,idx...);
}
};
// code to create object of above MultiArray class.
MultiArray<int, 1> a;
a.allocate(10)
编译器错误信息是: call of overrloaded "set_array<1,0>(std::array&, int&) is ambiguous ,
我的理解是调用set_array<1, 0>(_dim, 10)时,编译器无法知道应该使用哪一个,因为参数包可以为空。 我尝试了一些方法来修复但失败了。 有什么解决方案可以帮助我吗? 先感谢您!
您的问题是参数包允许为空。 如果你确实有一个空包,那么
void set_array(std::array<int,Rank>& A,int i,indices... idx)
只是
void set_array(std::array<int,Rank>& A,int i)
与您的非可变模板匹配。 您需要处理一个空参数包,最简单的方法是添加一个额外的参数,例如
template<int Rank,int D, typename First, typename... Rest>
void set_array(std::array<int,Rank>& A,int i,First first, Rest... rest)
{
A[D] = i;
set_array<Rank,D+1>(A,first, rest...);
}
现在,如果您仅使用 2 个参数调用 function,您将获得非可变参数过载,并且 3 个或更多参数将调用可变参数。
解决此问题的一种直接方法是第二次重载需要至少一个参数,方法是展开一次
template<int Rank,int D,typename index0, typename... indices>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.