繁体   English   中英

对重载可变参数模板 function 的模糊调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM