T * [] vs T **函数声明

时间:2013-06-09 19:28:55

标签: c++

有人告诉我,T*[] and a T**和二维数组之间的差异实际上并没有衰减到T **,如下所示:std::array to pointer access violation error

然而..如果它们不一样,为什么我不能同时声明这些功能呢?

template<typename T>
void Transpose(T** Data, std::size_t Size)
{
    for (int I = 0; I < Size; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I][J], Data[J][I]);
        }
    }
}

template<typename T>
void Transpose(T* Data[], std::size_t Size)
{
    for (int I = 0; I < Size; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I][J], Data[J][I]);
        }
    }
}

编译器说它已经声明了......有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这是因为在函数参数列表中,T* data[]只是写T** data的另一种方式。

要区分数组和指针,可以执行以下操作:

template<typemane T> void Transpose(T** data, ...) { ... }

template<typename T, int N> void Transpose(T* (&data)[N], ...) { ... }

但是在你的情况下,你不要使用这种区别,所以你可以写第一个版本并省略第二个版本。调用函数时数组到指针的自动衰减也会使它在数组上工作。

答案 1 :(得分:1)

当它们用作函数参数时,

T * []和T **是相同的。