Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载变量模板函数的不明确调用_C++_Templates_Ambiguous_Variadic - Fatal编程技术网

C++ 重载变量模板函数的不明确调用

C++ 重载变量模板函数的不明确调用,c++,templates,ambiguous,variadic,C++,Templates,Ambiguous,Variadic,我下载了一个C++库来支持GITHUB的多维数组,当我使用GCcc0.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; } // functio

我下载了一个C++库来支持GITHUB的多维数组,当我使用GCcc0.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)
//基本函数,设置尺寸D的长度i
样板
空集_数组(std::array&A,int i)
{
A[D]=i;
}
//函数,递归设置所有维度的长度
样板
void set_数组(std::array&A、int i、index…idx)
{
A[D]=i;
设置_数组(A,idx…);
}
//类在分配中调用set_数组
样板
类多数组
{
私人:
std::数组_dim={{0};
样板
无效分配(索引…idx){
静态断言(sizeof…(idx)=秩,
“传递给分配的索引数与数组的秩不匹配”);
设置数组(_dim,idx…);
}
};
//用于创建上述多数组类的对象的代码。
多阵列a;
a、 分配(10)
编译器错误消息为: 调用重载的“set_数组(std::array&,int&)”是不明确的


我的理解是调用set\u数组(\u dim,10),编译器无法知道应该使用哪一个,因为参数包可能是空的。我尝试了一些修复方法,但失败了。有什么解决方案可以帮助我吗?提前谢谢!

解决这个问题的简单方法是,第二个重载至少需要一个参数,方法是展开一次

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

这里的问题是允许参数包为空。如果您确实有空包,则

void set_array(std::array<int,Rank>& A,int i,indices... idx)
void set_数组(std::array&A、int i、index…idx)
只是

void set_array(std::array<int,Rank>& A,int i)
void set_数组(std::array&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...);
}
模板
void set_数组(std::array&A,int i,First First,Rest…Rest)
{
A[D]=i;
设置_数组(A,第一,其余;
}

现在,如果只使用2个参数调用函数,将得到非变量重载,3个或更多参数将调用变量重载。

代码的哪部分来自库,哪部分是您的?谢谢Dani,这与Nathan Oliver的解决方案相同。