remove_if: Alle Elemente löschen die != elem.GetSth() sind?
-
Weils mir gerade auffällt: Kann das irgendwie mit den Aufrufkonventionen zusammenhängen? Einmal schreibt er was von __thiscall und einaml von __cdecl, vielleicht hauts deswegen nicht hin mit einem ordentlichen Pointer auf eine Methode?
MfG SideWinder
-
Der Fehler ist der operator() (T elem)
T wird durch int ersetzt, Du willst aber TRMode haben.Mach doch:
template <class T, class X> struct not_equal_to_member { // Typen typedef T (X::*MethodPointer) () const; // Aufzurufende Vergleichsmethode private: MethodPointer mMethod; // Vergleichswert T mValue; // Konstruktoren public: not_equal_to_member (MethodPointer method, T value) : mMethod(method), mValue(value) { } // Operatoren bool operator() (X elem) const // hier darf nicht T stehen { return mValue != (elem.*mMethod)(); } };Damit kannst Du das Prädikat dann auch für andere Typen als TRMode einsetzen.
-
Hast recht, wäre aber offenbar nur ein Folgefehler gewesen. Er meckert ja beim Konstrukturaufruf und der hat mit dem op() noch nichts zu tun. Es funktioniert trotz der Richtigstellung immer noch nicht

/Edit: Hab hier mal einstweilen Boost installiert, mit Boost ists kein Problem. Bloß verstehe ich die Implementierung von denen nicht und direkt einsetzen kann ichs auhc nicht.
MfG SideWinder
-
Folgender kleiner Test compiliert hier und liefert ein korrektes Ergebnis:
#include <iostream> #include <vector> using namespace std; class Elem { int member; public: Elem( int y) : member( y) {}; int GetMember () const { return member; } }; template <class T, class X> struct not_equal_to_member { // Typen typedef T (X::*MethodPointer) () const; // Aufzurufende Vergleichsmethode private: MethodPointer mMethod; // Vergleichswert T mValue; // Konstruktoren public: not_equal_to_member (MethodPointer method, T value) : mMethod(method), mValue(value) { } // Operatoren bool operator() (X elem) const { return mValue != (elem.*mMethod)(); } }; int main() { vector<Elem> x; x.push_back( Elem( 1)); x.push_back( Elem( 0)); x.push_back( Elem( 2)); x.push_back( Elem( 0)); x.push_back( Elem( 3)); for( int i = 0; i < 10; ++i) { x.push_back( Elem( i)); } int value = 0; vector<Elem>::iterator eraseFrom = std::remove_if(x.begin(),x.end(), not_equal_to_member<int, Elem>(&Elem::GetMember,value)); x.erase(eraseFrom,x.end()); for( vector<Elem>::const_iterator it = x.begin(); it != x.end(); ++it) { cout << it->GetMember() << " "; } cout << endl; }Compiler ist irgendeine neuere GCC Version für Windows.
-
Nachtrag: Mit MSVC 7.1 geht's auch.
-
VERDAMMT VERDAMMT VERDAMMT VERDAMMT VERDAMMT VERDAMMT ICH SCHIESS SIE ALLE AB

Weil den Kerlen das TEXT()-Macro für hardcoded Unicode-Externalisierungen zu lang war haben die:
#define T TEXTeingeführt. Ich mein wie kann man den Standard-Template-Parametr fast aller Template-Klassen im Umlauf nur umdefinieren? Ich sitz verdammte 11 Stunden vor dem PC und jetzt erst wundert mich in der Template-Fehlermeldung dieses TEXT als Paramter, das wird doch sonst nie gemacht. Und dann bimmelts, ich will heulen

MfG SideWinder
-
hey sidewinder warum wird denn in deiner firma makros für public und private benutzt? oder steckt da mehr hinter als
#define PRIVATE private
#define PUBLIC public
-
Keine Ahnung, sowas kann ich in meiner Stellung nicht hinterfragen. In 3 Wochen heißts für mich wieder ab in die Schule und die bekommen die Sourcen soweit ich gekommen bin.
MfG SideWinder
-
lol man muss doch immer genau wissen was man tut und warum man etwas tut.

-
vielleicht alte java-hasen die mit C-makros C++ spielen wollen *hüstel*
-
Ist doch super praktisch wenn sich die keywords mal im Namen ändern.