0

我是 C++ 新手。我想确定 C++ 中字符串数组的大小。按照这个论坛上的建议,我创建了一个模板来给我数组的大小。相关代码是

virtual std::string _verify_list_or_string(std::string obj[]) {     
    std::cout << "debug " << sizeof_array(std::string, sizeof(obj)) << std::endl;

我使用的模板是

template <typename T, std::size_t N>
std::size_t sizeof_array( T (&)[N] ) {
   return N;
}

我得到一个编译错误:“错误:','之前的预期主表达式”

我究竟做错了什么?

4

4 回答 4

3

问题是,尽管有[],函数参数是指针而不是数组。您只能通过引用将数组传递给函数,然后它必须是对特定大小数组的引用 - 大小是数组类型的一部分。

如果您需要作为指针传递的数组的大小,那么一些选项是:

  • 使函数本身成为一个模板,就像你的sizeof_array,这样数组是通过引用传递的,并且大小作为模板参数可用;
  • 使函数成为模板,在两个参数中采用迭代器范围,因此它可以与任何类型的序列(包括数组)一起使用;
  • 将数组的大小作为第二个参数传递;
  • 传递一个类类型,例如std::array可以std::vector为您提供大小的接口。

该错误是因为您将废话传递给sizeof_array. 如果obj是一个数组,那么你会这样做sizeof_array(obj),并且模板参数将从obj. 但它不是一个数组,所以这也行不通。

于 2013-09-27T15:53:26.293 回答
2

有问题的表达式是sizeof_array(std::string, sizeof(obj)):std::string不是表达式而是类型。但是,修复该表达式将无济于事:该参数obj不是合适的参数,sizeof_array()因为它具有类型std::string*,而sizeof_array()将数组引用作为参数。

一旦数组衰减为指针,就无法恢复数组大小。如果要在函数中自动确定数组的大小,则需要通过引用传递数组,例如:

template <int Size>
std::string _verify_list_or_string(std::string (&obj)[Size]) {
    std::cout << "debug " << sizeof_array(obj) << '\n';
    return _verify_list_or_string(obj, Size);
}
virtual std::string _verify_list_or_string(std::string* obj, int Size) {
    ...
}

请注意,主入口点已转换为模板,不能为virtual. 因此,它转发给一个函数,该virtual函数接受一个指向数组及其大小的指针。

于 2013-09-27T15:54:38.833 回答
2

您的函数采用一个参数:

std::size_t sizeof_array( T (&)[N] )
//                       ^^^^^^^^^^

但是你通过了两个。此外,其中之一 - 类型:

sizeof_array(std::string, sizeof(obj))
//           ^^^^^^^^^^^^ ^^^^^^^^^^^

您可能想要传递一个obj变量。但问题是obj这里不是一个数组。因此,您无法通过obj这种方式获得大小。

于 2013-09-27T15:50:47.897 回答
0

这不是你调用模板函数的方式......参数,而不是模板参数进入函数调用括号。该函数旨在推断模板参数。如果无法推断,您可以这样调用:

std::string ary[6];
sizeof_array<std::string, 6>(ary);

由于可以进行推理,因此如果您只传递参数,编译器就会计算出模板参数:

sizeof_array(ary);

对您来说不幸的是,该模板函数仅适用于数组,但您有一个指针。没有尺寸信息可供您获取。

于 2013-09-27T15:50:38.663 回答