在vector排序中使用c++模板函数出错
Error with C++ template function in vector sort
我想使用一个模板函数来排序一个类的向量,但我得到了编译错误。错误是由模板引起的。当我使用类而不是模板时,它会编译。
class Person
{
private:
int ssn;
string name;
public:
Person() {};
Person(int s, string na) { ssn = s; name = na; }
const int getSSN() { return ssn; }
friend ostream& operator <<(ostream& out, const Person& per) {
out << per.ssn << " " << per.name;
}
};
template <typename T>
bool myfunction(T i, T j) { return (i.getSSN() < j.getSSN()); }
// it complies fine when I use
// bool myfunction(Person i, Person j) { return (i.getSSN() < j.getSSN()); }
int main()
{
ifstream in("personal.dat");
string st;
vector<Person> *vect = new vector<Person>;
int ssn;
string name;
while(in >> ssn >> name) {
Person per(ssn, name);
vect->push_back(per);
}
in.close();
sort(vect->begin(), vect->end(), myfunction);
for(int i=0; i<vect->size(); i++) cout << vect->at(i) << endl;
}
编译错误:
read.cxx: In function ‘int main()’:
read.cxx:41:45: error: no matching function for call to ‘sort(std::vector<Person>::
iterator, std::vector<Person>::iterator, <unresolved overloaded function type>)’
sort(vect->begin(), vect->end(), myfunction);
read.cxx:41:45: note: candidates are:
In file included from /usr/include/c++/4.8.3/algorithm:62:0,
from read.cxx:6:
/usr/include/c++/4.8.3/bits/stl_algo.h:5438:5: note: template<class _RAIter>
void std::sort(_RAIter, _RAIter) sort(_RandomAccessIterator __first,
_RandomAccessIterator __last)
.................
.................
有什么建议吗?非常感谢。
你应该告诉它你想比较的元素类型:
sort(begin, end, myfunction<Person>);
myfunction
是表示无限重载集的函数模板。要让编译器解析您想要哪种重载,您需要提供模板参数。在本例中,您需要一个Person
比较函数:
std::sort(vect->begin(), vect->end(), myfunction<Person>);
或者,您可以提供一个lambda表达式,将参数转发给myfunction
:
std::sort(vect->begin(), vect->end(),
[&] (Person const& lhs, Person const& rhs) { return myfunction(lhs, rhs); });
此外,您正在不必要地动态分配std::vector
。vector的意义在于省去了动态c风格数组的手动内存管理。只需静态分配,而不是使用->
操作符,使用.
:
std::vector<Person> vect;
//Actually, it was simple. I used following line in small test code it works fine.
//sort(fileVector->begin(), fileVector->end(), myfunction<T>);
//However, in my actual code, it crashes with Segmentation fault (core dumped). I am
//looking on this.
template <class T>
bool myfunction(T i, T j) { return (i.getSSN() < j.getSSN()); }
template <class T>
void sortt(vector<T> *vect)
{
sort(vect->begin(), vect->end(), myfunction<T>);
}
int main()
{
..............
..............
sortt(vect);
}
相关文章:
- 类中私有结构的构造函数出错
- 字符串验证函数出错
- 我的类默认构造函数出错
- Dev-C++和Code::Blocks中的析构函数出错
- int对的哈希函数出错
- MSVC 编译器错误导致迭代器和友元函数出错
- 复制构造函数出错
- 使用 WinSock2 开发,使用 CreateThread() 函数出错
- 链接列表的Push_back函数出错
- 结构初始化中的隐式复制构造函数出错
- 异步函数出错
- 编译器错误消息错误:令牌之前的预期')' '*'。我的构造函数出错
- c++中使用std::bind和std::函数出错
- 在vector排序中使用c++模板函数出错
- 使用std::for_each lambda函数出错
- 二叉搜索树插入函数出错
- 调用类的函数出错
- c++使用删除函数出错
- 使用已删除的函数出错
- 调用构造函数出错