有人告诉我,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]);
}
}
}
编译器说它已经声明了......有什么想法吗?
答案 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 **是相同的。