c++ - T*[] 与 T** 函数声明

标签 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]);
        }
    }
}

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

最佳答案

这是因为在函数参数列表中,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/

相关文章:

c++ - C++可以设计一种将指针保存在连续内存中并且不会使它们无效的数据结构吗?

c++ - 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::ptr_vector<Base> 的性能考虑因素是什么?

c++ - 如何将 CString 转换为 CHAR 数组?

c++ - 这个模板部分特化代码有什么问题?

c++ - 自由函数的部分模板特化——最佳实践

c++ - 删除 constexpr 会更改 gcc 上数组的值

c++ - 安全地将 int 转换为枚举

c++ - OpenMP、QTextEdit 和 QPlainTextEdit

c++ - 处理 WinAPI CreateFile 中的泄漏?

c++ - pointer_traits 为既不是 X<A, T...> 也没有提供成员 typedef element_type 的类型提供什么?