c++ - std::array to pointer 访问冲突错误

标签 c++ c++11

我试图让我的 Transpose 函数接受指针而不是 std::arrays。我想这样做的原因是因为这样我就可以通过 .data() 函数将指针或 std::array 传递给它。

目前我有以下内容,它可以使用 2D 和 1D 数组就地转置或转换为新数组。但是,将下面的代码转换为采用指针会产生内存访问冲突错误。

有人可以解释其中的区别以及为什么下面不等于我的指针版本(在下面):

#include <iostream>
#include <array>

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

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

但是,当我使用指针时,转换为以下内容不起作用 :S

template<typename T>
void Transpose(T* Data, std::size_t Size)
{
    int Width = sqrt(Size);
    for (int I = 1; I < Width; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I * Width + J], Data[J * Width + 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** 不起作用?

最佳答案

二维数组不会退化为双指针。它衰减为 T*[]。有关解释,请参阅 this thread .

您必须将故障线路更改为:

void Transpose(T* Data[], std::size_t Size)

或者(这样可以推导出长度)

template <typename T, std::size_t Size1, std::size_t Size2>
void Transpose(T (&Data)[Size1][Size2])

关于c++ - std::array to pointer 访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012382/

相关文章:

c++ - 当模板类 is_convertible 为众所周知的类型时,特化仿函数

c++ - 避免在此模板代码中创建变量

c++ - 将 Bimap boost 为 insert_or_modify

c++ - 使用 openCV 创建 super 矩阵

c++ - 错误: request for member 'clear' in 'graph' , which is of non-class type

c++ - C++ 中的除法汇总

c++ - 指定函数抛出异常的首选方式

c++ - 在 Windows C++ 中将字符串的区域设置感知解析为日期

c++ - 如何制作包含唯一指针的类的标准列表

c++ - (右值引用)VS(const 左值引用)作为 C++11 中的函数参数