2016-11-07 8 views
0

Was ist falsch an diesem Code? Ich möchte ungerade Zahlen sortieren, sondern auch bleiben ihre Plätze int, gemacht für diese Funktion aber compilator wird nicht passieren dieseC++ Vektorsortierung ungerade und gerade bleiben

Es gibt Fehler:

error: reference to non-static member function must be called

und es gibt einen Code:

public: 
std::vector<int> sortArray(std::vector<int> array) 
{ 
    std::vector<int> sortedArray(array); 
    std::sort (sortedArray.begin() , sortedArray.end() , oddSort); 
} 

bool oddSort (const int& left , const int& right){ 
    if (left % 2 && right % 2) 
    return left < right; 
    else if (left % 2) 
    return false; 
    else if (right % 2) 
    return true; 
    return left < right; 
} 
+1

'Bool oddSort (const int & links, const int & rechts)' muss eine statische Memberfunktion oder Namespace-Bereich oder globale Funktion seines – Danh

+0

Aus Neugier, warum Sie tun Möchten Sie es als Member-Funktion deklarieren, während es keine Mitgliedsdaten verwendet? – Danh

+0

Ich bezweifle ernsthaft, dass dies tun wird, was Sie wollen, auch nachdem Sie es "statisch" gemacht haben. Zum einen gibst du niemals etwas von deiner 'sortArray'-Funktion zurück. Zum anderen glaube ich nicht, dass Ihre Annahme in Ihrem Vergleicher die Bewegung von Elementen verhindert, wie Sie es sich vorstellen. Wenn ich Ihren Komparator richtig lese, werden alle geraden Elemente am Anfang des Arrays gestapelt, die Chancen am Ende. – WhozCraig

Antwort

1

Danh Kommentar ist richtig, aber das ist eigentlich eine doppelte Frage. Es gibt jedoch noch keine Duplikate mit akzeptierten Antworten.

Also: das Problem ist, dass Mitgliedsfunktionen einen Zeiger this benötigen, es sei denn, sie sind static. Und std::sort gibt Ihnen keinen this Zeiger, noch brauchen Sie einen. So ist es die einfache Lösung static zu machen.

+0

ist das nicht was ich geschrieben habe? –

+0

@O_Z: Natürlich. Race Zustand. – MSalters

+0

yeah, O_Z hast du gut geantwortet aber MSalters Antwort ist erklärender :) – Asmozan

2

sort ist keine Methode der Klasse, also wird es nicht den richtigen this Zeiger haben, so ein Member-Funktion aufrufen ist ein Problem.

When a non-static class member is used in any of the contexts where the this keyword is allowed (non-static member function bodies, member initializer lists, default member initializers), the implicit this-> is automatically added before the name, resulting in a member access expression (which, if the member is a virtual member function, results in a virtual function call).

http://en.cppreference.com/w/cpp/language/this

0

Ich würde vorschlagen, dass Sie sich this ansehen. Es gibt einen Unterschied zwischen den Typen der nicht statischen Elementfunktion und der statischen Elementfunktion. Und ich glaube, das CPP-Konzept Compare die Form wie die statisch diejenigen erfordert

Verwandte Themen