2

有人告诉我,实际上 aT*[] 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]);
        }
    }
}

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

4

2 回答 2

2

这是因为在函数参数列表中,T* data[]只是另一种编写T** data.

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

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

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

但是,在您的情况下,无论如何您都不会使用这种区别,因此您可以只编写第一个版本并省略第二个版本。调用函数时数组自动衰减为指针,这也将使它在数组上工作。

于 2013-06-09T19:34:52.040 回答
1

T*[] 和 T** 在用作函数参数时是相同的。

于 2013-06-09T19:34:54.730 回答