错误:在'之前预期的primary-expression'

时间:2013-09-27 15:48:30

标签: c++ templates

我是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;
}

我收到编译错误:“错误:在','”之前预期的primary-expression

我做错了什么?

4 个答案:

答案 0 :(得分:3)

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

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

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

错误是因为您将废话传递给sizeof_array。如果obj是一个数组,那么您将sizeof_array(obj),并且模板参数将从obj的类型推断出来。但它不是一个数组,因此也无法正常工作。

答案 1 :(得分:2)

您的函数需要一个参数:

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

但是你要经过两次。而且,其中之一 - 键入:

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

您可能想要传递obj变量。但问题是obj不是这里的数组。所以,你不能以这种方式获得obj的大小。

答案 2 :(得分: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函数,获取指向数组及其大小的指针。

答案 3 :(得分:0)

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

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

由于可以进行推理,如果只传递参数,编译器将找出模板参数:

sizeof_array(ary);

不幸的是,该模板函数仅适用于数组,但您有一个指针。你没有尺码信息。