编译时报 prototype for 'Function(std::__cxx11::string)' does not match any in class '' Function(const std::string)
原因分析
std::__cxx11::string和std::string不匹配。
hpp文件里面使用的是#include <string.h>,后面改成#include <string>就好了。
c++中,string和string.h的文件不一样,大概是string.h的string类型跟std::__cxx11::string类型不一样。解决方法
把<string.h>改成<string>就好了。其他问题
函数声明和定义要对应好,注意使用const和&。
自定义sort的比较方法,编译时报 error: invalid use of non-static member function 'bool MyClass::cmp()'
- 原因分析
不正确使用非静态成员函数。
类中的成员函数如果没有声明static,那么默认会在函数声明的变量中加入类对象的指针this,
即如果声明的是bool MyClass::cmp(const int &, const int &),其结果实际上是bool MyClass::cmp(MyClass *this, const int &, const int &)。
其中一种解释是说,函数的参数不匹配,
sort中的函数需要2个变量,而声明在类中的函数实际上有3个。另一种说法是,当
cmp为非静态函数时,在进行sort的编译时,编译器无法传递this指针,因此无法理解是调用了哪个对象的cmp函数,因此提示错误使用非静态函数。
静态函数与非静态函数的区别
- 静态函数属于类本身,在类加载时就会分配内存,由所有类的对象共享,可以通过
Class::Function直接访问,函数内不会传递对象this指针。- 非静态函数只有在实例对象创建时才会分配内存,可以通过对象进行调用。
- 静态函数的参数类型可以是该类,而普通成员函数不行。同时,静态函数中不应出现类的非静态成员,除非参数中存在该类。
- 解决方法
在hpp文件上相关函数加上static,同时更改函数中引用的函数为static。 - 参考文档: