数组的引用作为返回值,为什么报错?

初学者,但在网上找不到答案。。有哪位好心人能帮我看看,不甚感激

template<int SIZE> 
int(&a)[SIZE] insertSort(int(&arr)[SIZE])
{
    return arr;
};
void main()
{
    int arr[] = {2,4,56,65,3,6,9,4,3,5,8,4,2,1,0};
    insertSort(arr);//提示找不到insertSort函数,如果将函数的返回值修改一下,编译就能通过
}
阅读 4.1k
3 个回答

你的函数写法也有问题,stackoverflow找来一个答案,亲测可运行

template<size_t n>
int (&insertSort(int (&arr)[n]))[n]
{
    return arr;
}

http://stackoverflow.com/a/2302395

顺便叨逼一句,尽量不要这么做

  1. 这种代码难以阅读,而且这样的template不甚科学,来一个新的n就会生成一个新的函数
  2. 想返回数组的话可以用指针,但也尽量不要这么做,因为函数内分配内存容易造成内存泄漏(除非它只干了分配内存这一件事)
  3. 正确的用数组的返回方式是传一个已分配好内存的指针进去如这样void sort(const int *arr, int *sortedArr)
  4. 更推荐用vector

第一行是这样的:template<int SIZE>

既然是使用的C++,这里是可以不用指针做到类型安全的。如 @wangdai 说的vector。至于返回,赋值什么的这些都不用管,最简单的直接使用out参数

#include <vector>
#include <utility>
#include <iostream>

template<class t>
void insert_sorter(std::vector<t>& array /* out */) {
    /// ...
    array[3] = 0xff;
}

int main() {
    std::vector<int> array = {1, 2, 3, 4, 5};
    insert_sorter(array);
    std::cout << array.at(3) << std::endl;
}

当然,如果你必须要通过返回来到达高比格的效果,那就这样

#include <vector>
#include <utility>
#include <iostream>

template<class t>
std::vector<t> insert_sorter(std::vector<t>& array) {
    /// ...
    array[3] = 0xff;

    /// move 语义不会重复拷贝array的data数据
    return std::move(array);
}

int main() {
    std::vector<int> array = {1, 2, 3, 4, 5};
    /// 这里使用了完美的移动赋值操作,是不是比`C`的方式顺眼多了
    /// 不过要记住array后面不能再使用了
    std::vector<int> ret = insert_sorter(array);
    std::cout << ret.at(3) << std::endl;
}

老实说,正统的C++方式应该是

/// 按stl的范式实现自己的sort
std::sort(s.begin(), s.end(), [](int a, int b) {
    return b < a;   
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题