我是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
我做错了什么?
答案 0 :(得分:3)
问题在于,尽管[]
,函数参数是指针而不是数组。您只能通过引用将数组传递给函数,然后它必须是对特定大小的数组的引用 - 大小是数组类型的一部分。
如果你需要一个作为指针传递的数组的大小,那么一些选项是:
sizeof_array
一样,这样数组就可以通过引用传递,并且大小可用作模板参数; std::array
或std::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);
不幸的是,该模板函数仅适用于数组,但您有一个指针。你没有尺码信息。