【问题标题】:Returning element from a 2D array (type error)从二维数组返回元素(类型错误)
【发布时间】:2020-11-27 15:05:45
【问题描述】:

尝试为我的 2D 数组类 Matrix3D 编写访问器,但是编译器给了我关于 c 样式代码的问题,我希望在这种情况下可以正常工作。有问题的错误是

错误 C2440:'return':无法从 'const T [3]' 转换为 'const T'

使用我的访问器时:

    const T operator()(eMatrix3D::eMatrix3DElements) const
    T operator()(eMatrix3D::eMatrix3DElements)

希望获得有关问题根本原因的一些反馈,以及有关如何使我的代码与 std::array<std::array<T, 3>, 3> m_elem 而不是 T m_elem[3][3] 兼容的反馈,以及需要注意哪些差异?

请在下面找到示例代码:

namespace eMatrix3D {
    //////////////////////////////////////////////////////////////////////////
    // *** ENUMS ***
    //////////////////////////////////////////////////////////////////////////
    enum eMatrix3DElements
    {
        e11 = 0,
        e12,
        e13,
        e21,
        e22,
        e23,
        e31,
        e32,
        e33
    };
}

template <typename T>
class Matrix3D
{
public:
    //////////////////////////////////////////////////////////////////////////
    // *** CONSTRUCTORS ***
    //////////////////////////////////////////////////////////////////////////

    /// Default Constructor
    //
    Matrix3D(void);

    /// External initialization Constructor
    //
    Matrix3D(const T& p_11, const T& p_12, const T& p_13,
             const T& p_21, const T& p_22, const T& p_23,
             const T& p_31, const T& p_32, const T& p_33);

    //////////////////////////////////////////////////////////////////////////
    // *** DESTRUCTOR ***
    //////////////////////////////////////////////////////////////////////////

    /// Destructor
    //
    ~Matrix3D(void);
    ...
    //////////////////////////////////////////////////////////////////////////
    // *** PUBLIC METHODS (Accessors) ***
    //////////////////////////////////////////////////////////////////////////

    /// Get matrix m_element
    /// \note 1-indexed
    //
    const T operator()(eMatrix3D::eMatrix3DElements) const;
    /// Get matrix m_elem (non-const version)
    /// \note 1-indexed
    //
    T operator()(eMatrix3D::eMatrix3DElements);
    ...
private:
    /// Matrix m_elements
    //
    T m_elem[3][3]; //std::array<std::array<T, 3>, 3> m_elem;
}

//////////////////////////////////////////////////////////////////////////
// *** PUBLIC METHODS (Accessors) ***
//////////////////////////////////////////////////////////////////////////


/// Get matrix m_elem
/// \note 1-indexed
//
template <typename T>
const T Matrix3D<T>::operator()(eMatrix3D::eMatrix3DElements index) const
{
    return *(m_elem + index);
}


/// Get matrix m_elem (non-const version)
/// \note 1-indexed
//
template <typename T>
T Matrix3D<T>::operator()(eMatrix3D::eMatrix3DElements index)
{
    return *(m_elem +index);
}

【问题讨论】:

  • 为什么不用两个索引来索引矩阵(m_elem[i][j])?看来你还是想这样做。

标签: c++ multidimensional-array


【解决方案1】:

既然您已经使用enum(顺便说一句。考虑使用enum class)作为您的索引并且您的存储是私有的,为什么不使用一维数组/向量呢?

如果您退后一步,您基本上希望使用Matrix3D.get(1,1) 之类的索引访问您的坐标e11 等。这里的映射是微不足道的。然后人们通常希望使用单维结构并将他们的索引i,j 转换为i*&lt;size_of_first_dimension&gt; + j 之类的东西,以保持二维界面。现在您已经希望通过您通过enum 提供的单个索引来访问它。这实际上已经为您进行了有意义的翻译,所以我看不出您为什么会在内部使用 2D 结构。它只会让它变得更复杂。

如果您真的想在内部保留 2D,您需要使用除法和模数将您的 1D 枚举索引转换回有意义的 2D 索引,或者您基于它硬编码 switch-case

此外,我宁愿使用operator[] 或专用的at() 方法,而不是operator(),因为这通常与函数调用和构造(这是对构造函数的函数调用)相关联。从长远来看,这可能会让您和Matrix3D 的用户感到困惑。

【讨论】:

    【解决方案2】:

    这里有一些事实。

    • *(m_elem + index)m_elem[index] 完全相同,根据下标运算符的定义。
    • m_elemT 的数组。它与T 的数组不同。
    • m_elem 的元素是T 的数组。 *(m_elem + index)m_elem[index],完全相同,就是这样一个元素。是T的数组,和T不一样。

    如果您希望 m_elem 是一个由 9 个 T 元素组成的线性数组,那么您应该以这种方式声明它,并使用单个下标运算符访问它。如果您希望它是一个包含 3 个 T 元素的 3 个数组的数组,您可以通过连续使用两个下标运算符来提取单个 Ts。但是你不能混合和匹配这两种方法。

    这同样适用于内置数组、std::arrays 和其他类似数组的容器。

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 1970-01-01
      • 2014-12-27
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多