簡體   English   中英

向量排序中的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 向量的要點是省去了動態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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM