VS2010运行mergeSort报错

来源:3-2 归并排序法的实现

shanmufeng

2017-01-12

我用VS2010运行老师提供的代码报错:

1>  main.cpp
1>h:\c++\datastructure\mergesort\mergesort\sorttesthelper.h(23): warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
1>h:\c++\datastructure\mergesort\mergesort\sorttesthelper.h(35): warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
1>h:\c++\datastructure\mergesort\mergesort\main.cpp(58): error C2896: “void SortTestHelper::testSort(const std::string &,void (__cdecl *)(T [],int),T [],int)”: 不能将函数 模板“void mergeSort(T [],int)”用作函数参数
1>          h:\c++\datastructure\mergesort\mergesort\main.cpp(42) : 参见“mergeSort”的声明
1>h:\c++\datastructure\mergesort\mergesort\main.cpp(58): error C2784: “void SortTestHelper::testSort(const std::string &,void (__cdecl *)(T [],int),T [],int)”: 未能从“重载函数类型”为“重载函数类型”推导 模板 参数
1>          h:\c++\datastructure\mergesort\mergesort\sorttesthelper.h(73) : 参见“SortTestHelper::testSort”的声明
1>
1>生成失败。
1>
1>已用时间 00:00:00.42
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

我试着将testSort调用改成

SortTestHelper::testSort("Merge Sort",     mergeSort<int>,     arr2, n);

也会报错(之前的selectionSort,insertSort经过这样的修改就不会报错了):

1>  main.cpp
1>h:\c++\datastructure\mergesort\mergesort\sorttesthelper.h(23): warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
1>h:\c++\datastructure\mergesort\mergesort\sorttesthelper.h(35): warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
1>d:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2227): warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>          d:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2212) : 参见“std::_Copy_impl”的声明
1>          h:\c++\datastructure\mergesort\mergesort\sorttesthelper.h(48): 参见对正在编译的函数 模板 实例化“_OutIt std::copy<int[],int*>(_InIt,_InIt,_OutIt)”的引用
1>          with
1>          [
1>              _OutIt=int *,
1>              _InIt=int []
1>          ]
1>h:\c++\datastructure\mergesort\mergesort\main.cpp(14): error C2057: 应输入常量表达式
1>          h:\c++\datastructure\mergesort\mergesort\main.cpp(38): 参见对正在编译的函数 模板 实例化“void __merge<T>(T [],int,int,int)”的引用
1>          with
1>          [
1>              T=int
1>          ]
1>          h:\c++\datastructure\mergesort\mergesort\main.cpp(44): 参见对正在编译的函数 模板 实例化“void __mergeSort<T>(T [],int,int)”的引用
1>          with
1>          [
1>              T=int
1>          ]
1>          h:\c++\datastructure\mergesort\mergesort\main.cpp(58): 参见对正在编译的函数 模板 实例化“void mergeSort<int>(T [],int)”的引用
1>          with
1>          [
1>              T=int
1>          ]
1>h:\c++\datastructure\mergesort\mergesort\main.cpp(14): error C2466: 不能分配常量大小为 0 的数组
1>h:\c++\datastructure\mergesort\mergesort\main.cpp(14): error C2133: “aux”: 未知的大小
1>
1>生成失败。
1>
1>已用时间 00:00:00.50
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

我试着只运行mergeSort(arr1,n);,同样会报上面的错误。


不知道是不是只是我编译器的问题?



写回答

3回答

liuyubobobo

2017-01-12

不算是编译器的问题。因为VS的编译器和C++标准的编译器在实现上有区别,而且不同的VS版本还有一些差异,所以具体代码会有一些不同。


具体你遇到的问题,首先,VS不支持动态长度数组,所以merge中的辅助空间aux需要借助new来开辟,具体可以参照这个问题:http://coding.imooc.com/learn/questiondetail/3044.html


其次,VS似乎不支持copy函数,或者说认为copy函数是不安全的。所以你需要将SortTestHelper.h中,copyIntArray函数手动写一份循环,具体可以参见这个问题;http://coding.imooc.com/learn/questiondetail/3454.html


至于你说的mergeSort<int>的问题,你的修改方式是对的。VS编译器在具体语法层面标准和C++标准也有区别。不过似乎VS2016更贴合C++的正规标准了。微软就是喜欢搞自己的标准,从浏览器到编译器。。。:-)

0
5
liuyubobobo
赞“折腾不是坏事“!
2017-01-12
共5条回复

ALGO_cui

2017-03-31

老师,

#include<vector>

vector<T> aux(r-l+1);

还是报错。

0
1
liuyubobobo
使用new来开辟aux吧:)
2017-08-19
共1条回复

shanmufeng

提问者

2017-01-12

我试了用Linux和mac直接运行老师的代码都不会报错,这是什么情况了。。。

0
1
liuyubobobo
因为VS的编译器不符合C++的标准啊。你在mac或者Linux下肯定无法使用VS的编译器。在这个点上,会存在一些语法的差异:)
2017-08-19
共1条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程