有人告诉我,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]);
}
}
}
编译器说它已经声明了..有什么想法吗?
最佳答案
这是因为在函数参数列表中,T* data[]
只是编写 T** data
的另一种方式。
要区分数组和指针,可以执行以下操作:
template<typemane T> void Transpose(T** data, ...) { ... }
template<typename T, int N> void Transpose(T* (&data)[N], ...) { ... }
但是,在您的情况下,您无论如何都不会使用这种区别,因此您可以只编写第一个版本并省略第二个版本。调用函数时数组到指针的自动衰减将使其也适用于数组。
关于c++ - T*[] 与 T** 函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013325/