编译时报 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
。 - 参考文档: