C++传递std::array字符串数组到函数后调用begin、end及size()报错问询
错误根源
你传递给sortArrays函数的参数是std::array首元素的地址,函数形参string arr[]在C++中会自动退化为string*类型的指针。指针属于原生类型,没有begin()、end()、size()这类成员方法,这就是编译报错的直接原因。你在main函数中可以正常调用这些方法,是因为你操作的是std::array类的实例对象,该类模板本身封装了这些成员方法。
另外你原代码中std::sort的调用写法也有错误:sort函数接收的是首尾两个迭代器参数,不需要对迭代器做解引用操作。
修复方案
方案1:直接传递std::array对象(推荐)
通过模板适配不同大小的std::array,保留对象的完整类型信息,可以直接调用自带的begin()、end()方法:
#include <iostream> #include <array> #include <string> #include <algorithm> using namespace std; // 模板适配不同大小的std::array<string, N> template<size_t N> void sortArrays(array<string, N>& arr) { sort(arr.begin(), arr.end()); // 排序后输出验证 for(const auto& str : arr) { cout << str << " "; } cout << endl << endl; } int main() { array<string, 5> hello = {"Hello", "world", "How", "Are", "You"}; sortArrays(hello); return 0; }
方案2:传递指针+长度(兼容原生数组场景)
如果你一定要传原生指针作为参数,需要同时把数组长度传入函数,手动构造排序的迭代器范围:
#include <iostream> #include <array> #include <string> #include <algorithm> using namespace std; void sortArrays(string* arrPtr, size_t len) { sort(arrPtr, arrPtr + len); // 排序后输出验证 for(size_t i=0; i<len; i++) { cout << arrPtr[i] << " "; } cout << endl << endl; } int main() { array<string, 5> hello = {"Hello", "world", "How", "Are", "You"}; sortArrays(hello.data(), hello.size()); return 0; }
内容的提问来源于stack exchange,提问作者theNewGuy
相关产品推荐
相关产品推荐

