对重载可变参数模板函数的歧义调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对重载可变参数模板函数的歧义调用相关的知识,希望对你有一定的参考价值。

我从github下载了一个C ++库来支持多维数组,当我使用GCC8.2.0构建它时,编译器遇到一条消息,说重载函数不明确。考虑以下代码:

// 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)

编译器错误消息为:重载“ set_array <1,0>(std :: array&,int&)的调用不明确

我的理解是调用set_array <1,0>(_ dim,10)时,编译器无法知道应该使用哪一个,因为参数包可以为空。我尝试了一些修复方法,但失败了。有什么解决方案可以帮助我吗?预先谢谢!

答案

解决这个问题的一种直接方法是,通过展开一次,至少需要一个参数来进行第二次重载

template<int Rank,int D,typename index0, typename... indices>

以上是关于对重载可变参数模板函数的歧义调用的主要内容,如果未能解决你的问题,请参考以下文章

[问题记录]Java关于可变参数重载问题

如何解决使用文字 0 和指针调用重载函数的歧义

java中重载覆盖和隐藏三者的区别分析

如何对可变参数函数中的所有参数调用 std::forward ?

具有模板函数名称的可变参数模板

对Java方法方法重载的理解