C++ 数组模板中的元素计数

C++ 数组模板中的元素计数,c++,arrays,templates,C++,Arrays,Templates,我为2D数组编写了一个模板,并设计了一种计算数组中元素数量的方法。但是,该方法不返回任何内容 template <class T, int row, int column> class array2d { private: typedef T value; //typedef value * iterator; std::vector<T> array; public: array2d() : array(row * column) {}

我为2D数组编写了一个模板,并设计了一种计算数组中元素数量的方法。但是,该方法不返回任何内容

template <class T, int row, int column>
class array2d {
private:
    typedef T value;
    //typedef value * iterator;
    std::vector<T> array;
public:

    array2d() : array(row * column) {}
    explicit array2d( std::initializer_list<T> list) : array(list) {}

    constexpr T& length(){
        int cnt = 0;

        for (auto element : array)
            ++cnt;

        return cnt;
    }

其他方法正确地返回我需要的内容。似乎在使用int时,我不能使用.size,因为它返回一个无符号的long-long int,并决定对其中的元素进行计数。

没有理由不使用size。首选的类型是std::size\u t,但您可以选择最适合自己的类型:

auto length()
{
  return (your_type_t) array.size();
}
T&是返回类型的一个非常糟糕的选择。从返回对本地对象的引用中得到UB,如果我使用双类型的array2d呢?我可以将array2d与非算术类型一起使用吗

返回std::size\u t


未定义的行为!您正在返回对局部变量cnt的引用。删除引用。另外,也不要使它过于复杂,只需使用arrat.size。不要返回对local-returnby值的引用。另外,为什么array2d的长度是double类型?它不应该是整型的吗?为什么不直接返回row*column或array.size?元素的数量不是静态已知的吗?行*列?如果有静态数组,为什么要使用std::vector呢。为什么不使用std::array,row>?另外,您使用int进行计数,但返回T。并且您已经有了array.size,那么为什么要迭代向量呢?顺便说一句,您应该包含一个完整的示例,用于询问有关代码问题的问题。函数确实返回了一些东西,但不是您期望它返回的东西。只有代码的答案是不好的。你能解释为什么这是正确的,或者OPs代码有什么问题吗?@idclev Edited.you错过了解释为什么OPs代码是错误的,所以不清楚你的代码如何更好。问题不在于sizeOPs代码无法编译。因为它是UB,它也可能会使计算机爆炸。我似乎看不到OP试图达到的大致方向。这个问题需要用一个可重复性最低的例子来澄清。我使用了T&因为这是作者在中使用的。他定义了大多数方法,比如constexpr T const&operator size_T const r,size_T const c const{return arr[r*column+c];}@xampierre,这对于访问数组的元素是有意义的,因为它们属于类型T,引用授予对实际元素的访问权,而不是副本。但就尺寸而言。。。假设我使用了您的类并使用了array2d myArray;。如果我要求myArray.length并得到24.99作为回报,你认为这样做对吗?关于通过引用返回,这只有在对象比引用寿命长时才有意义。实际上,它几乎完全是在返回类或参数的成员(如In运算符)时完成的
std::size_t length(){
    return array.size();
}