C++ 如何使用;空排序(“空排序”、“空排序”、“空比较”);“的;算法";类中的头文件
我正在编写代码,无法从类内部使用C++ 如何使用;空排序(“空排序”、“空排序”、“空比较”);“的;算法";类中的头文件,c++,C++,我正在编写代码,无法从类内部使用sort()方法 class MyClass { struct MyStruct { ... } MyStructArr[10]; void fun() { ... // setting values of MyStructArr sort(MyStructArr, MyStructArr + 10, cmp); // !ERROR! } int cmp(stru
sort()
方法
class MyClass {
struct MyStruct {
...
} MyStructArr[10];
void fun() {
... // setting values of MyStructArr
sort(MyStructArr, MyStructArr + 10, cmp); // !ERROR!
}
int cmp(struct MyStruct a, struct MyStruct b) {
...
}
};
但同样的代码在没有类的情况下工作
struct MyStruct {
...
} MyStructArr[10];
int main() {
... // setting values of MyStructArr
sort(MyStructArr, MyStructArr + 10, cmp);
return 0;
}
int cmp(struct MyStruct a, struct MyStruct b) {
...
}
我无法理解为什么带有比较功能的排序(…)
内部不工作
班级。以下是错误:
SuffixArray.cpp: In member function 'void SuffixArray_Entry::suffixArray()':
SuffixArray.cpp:31:43: error: no matching function for call to 'sort(SuffixArray_Entry::SuffixArray_entry [65536], SuffixArray_Entry::SuffixArray_entry*, <unresolved overloaded function type>)'
sort(L, L + N, SuffixArray_cmp);
^
SuffixArray.cpp:31:43: note: candidates are:
In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0,
from SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5461:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter)
sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5461:5: note: template argument deduction/substitution failed:
SuffixArray.cpp:31:43: note: candidate expects 2 arguments, 3 provided
sort(L, L + N, SuffixArray_cmp);
^
In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0,
from SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5497:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = SuffixArray_Entry::SuffixArray_entry*; _Compare = int (SuffixArray_Entry::*)(SuffixArray_Entry::SuffixArray_entry, SuffixArray_Entry::SuffixArray_entry)]
sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5497:5: note: no known conversion for argument 3 from '<unresolved overloaded function type>' to 'int (SuffixArray_Entry::*)(SuffixArray_Entry::SuffixArray_entry, SuffixArray_Entry::SuffixArray_entry)'
make.exe[2]: *** [build/Debug/MinGW-Windows/SuffixArray.o] Error 1
make.exe[2]: Leaving directory `/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/CPPStoreRoom'
make.exe[1]: *** [.build-conf] Error 2
make.exe[1]: Leaving directory `/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/CPPStoreRoom'
make.exe": *** [.build-impl] Error 2
SuffixArray.cpp:在成员函数“void SuffixArray_Entry::SuffixArray()”中:
cpp:31:43:错误:调用“sort(后缀数组项::后缀数组项[65536],后缀数组项::后缀数组项*,)时没有匹配函数
排序(L,L+N,后缀数组);
^
SuffixArray.cpp:31:43:注:候选人为:
在c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0中包含的文件中,
来自SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl\u algo.h:5461:5:注意:模板void std::sort(\u RAIter,\u RAIter)
排序(_RandomAccessIterator uu first,_RandomAccessIterator u last)
^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5461:5:注意:模板参数推导/替换失败:
SuffixArray.cpp:31:43:注意:候选者需要2个参数,提供3个参数
排序(L,L+N,后缀数组);
^
在c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0中包含的文件中,
来自SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl\u algo.h:5497:5:注意:void std::sort(_RAIter,_RAIter,_Compare)[with _RAIter=SuffixArray\u Entry::SuffixArray\u Entry*;_Compare=int(SuffixArray\u Entry::*)(SuffixArray\u Entry::SuffixArray\u Entry::SuffixArray\u Entry)]
排序(_RandomAccessIterator uu first,_RandomAccessIterator u last,
^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5497:5:注意:参数3从“”到“int”的转换未知(后缀数组项::*)(后缀数组项::后缀数组项,后缀数组项::后缀数组项)
make.exe[2]:***[build/Debug/MinGW-Windows/SuffixArray.o]错误1
make.exe[2]:离开目录“/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/cppstorroom”
make.exe[1]:***[.build conf]错误2
make.exe[1]:离开目录“/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/cppstorroom”
make.exe:***[.build impl]错误2
这是我的原始程序的错误堆栈跟踪。我正在使用Netbeans和MinGW声明成员函数
cmp
作为静态成员函数。
考虑到如果函数的参数是引用会更好
另一种方法是在类内定义函数对象
class MyClass {
struct MyStruct {
...
} MyStructArr[10];
struct cmp
{
bool operator ()( const struct MyStruct &a, const struct MyStruct &b ) const
{
//....
}
};
void fun() {
... // setting values of MyStructArr
sort(MyStructArr, MyStructArr + 10, cmp());
}
...
您还可以将
操作符声明成员函数cmp
定义为静态成员函数。
考虑到如果函数的参数是引用会更好
另一种方法是在类内定义函数对象
class MyClass {
struct MyStruct {
...
} MyStructArr[10];
struct cmp
{
bool operator ()( const struct MyStruct &a, const struct MyStruct &b ) const
{
//....
}
};
void fun() {
... // setting values of MyStructArr
sort(MyStructArr, MyStructArr + 10, cmp());
}
...
此外,您还可以定义运算符排序将包含一些类似于以下内容的代码:
template <typename Iter, typename Cmp>
void sort(Iter begin, Iter end, Cmp cmp)
{
// other code
if (cmp(a, b)) { // <-- !!!
// Do something
} else {
// Do something else
}
}
但是sort
没有调用cmp
的MyClass
,它只有它真正想要比较的东西
您可以使您的cmp
不依赖于MyClass
(通过使其成为非成员函数或使其成为static
),也可以使用lambda或std::bind
或类似工具将MyClass
的实例绑定到该类上。sort
内部将有一些类似的代码:
template <typename Iter, typename Cmp>
void sort(Iter begin, Iter end, Cmp cmp)
{
// other code
if (cmp(a, b)) { // <-- !!!
// Do something
} else {
// Do something else
}
}
但是sort
没有调用cmp
的MyClass
,它只有它真正想要比较的东西
您可以使您的cmp
不依赖于MyClass
(通过使其成为非成员函数或使其成为static
),也可以使用lambda或std::bind
或类似工具将MyClass
的实例绑定到它。cmp
不能是非静态成员函数(而且它没有理由这样做)。将其设为静态。当您这样做时,可以将这些参数作为常量引用传递,并返回bool
作为排序
请求的规范。或者将其设为自由函数,如第二个示例中所示(尽管您必须从MyClass
公开MyStruct
,才能使其工作)cmp
不能是非静态成员函数(而且它没有理由这样做)。将其设置为静态。在进行此操作时,可以将这些参数作为常量引用传递,并返回bool
,作为sort
请求的规范。或者将其设置为第二个示例中的免费函数(尽管您必须从MyClass
公开MyStruct
,才能使其正常工作)谢谢你,弗拉德。现在正在工作。请你告诉我一些我可以阅读的文档。(一些公认的或官方的文件)AfZaleX我建议N.M. Josuttis阅读“C++标准库”。谢谢弗拉德。现在正在工作。请你告诉我一些我能读到的文档。(一些公认的或官方的文件)@ AZALEX我建议读N.M.约瑟蒂斯的“C++标准库”。