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回答
-
不算是编译器的问题。因为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++的正规标准了。微软就是喜欢搞自己的标准,从浏览器到编译器。。。:-)
052017-01-12 -
ALGO_cui
2017-03-31
老师,
#include<vector>
vector<T> aux(r-l+1);
还是报错。
012017-08-19 -
shanmufeng
提问者
2017-01-12
我试了用Linux和mac直接运行老师的代码都不会报错,这是什么情况了。。。
012017-08-19
相似问题