Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: std::vector Problem
pajofego
2007-12-31, 01:52:31
Guten Abend zusammen,
muss für Matlab (Mex) ein paar alte source Dateien neu compilieren, dabei stoße ich auf eine Fehlermeldung in Zusammenhang mit std::vector.
Auszug aus der header Datei:
class XY{
public:
template<class T>
static void swap(T* a, const long i, const long j) { T tmp = a; a[i] = a[j]; a[j] = tmp; }
};
Aufruf der den Fehler verusacht:
XY::swap(y.begin(), i,j);
Folgende Fehlermeldung wirft der Compiler raus:
[I]no matching function for call to `XY::swap(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, long int&, const long int&)'
Kann mir bitte einer damit weiterhelfen? Danke.
Beste Grüße
pajofego
Probier mal &y[0] statt y.begin()
del_4901
2007-12-31, 06:57:07
Sowas hatte ich neulich auch, da war irgendwas bei (im sinne von um) der Deklaration von iterator oder Vector verfriemelt. Ich weiß jetzt aber nichtmehr genau was es war. Möglicherweise liegst auch an einem Precompiled Header.
pajofego
2007-12-31, 14:37:52
@coda: Danke, so klappt's. Ich hätte auch darauf kommen können, war dann doch zu sehr verwirrt vom Fehler.
@AlphaTier: Precompiled Header verwende ich nicht. Ich hatte versucht etwas in dieser Richtung zu ändern:
static void swap(std::vector<T>::iterator *a, const long i, const long j) { T tmp = a[i]; a[i] = a[j]; a[j] = tmp; }
Aber das mag der Compiler auch nicht. Nur des Verständnis wegens hätte mich interessiert, wie hätte a in der Methode deklariert werden müssen?
Danke und einen guten Rutsch wünschen ich allen 3dcenter Mitgliedern.
Gruß
pajofego
Da müsstest du auch am Code was ändern, ich glaube man keine Offsets direkt so mit Iteratoren verwenden.
static void swap(std::vector<T>::iterator &a, const long i, const long j) { T tmp = *(a+i); *(a+i) = *(a+j); *(a+j) = tmp; }
Könnte funktionieren.
pajofego
2008-01-03, 00:03:16
Da müsstest du auch am Code was ändern, ich glaube man keine Offsets direkt so mit Iteratoren verwenden.
static void swap(std::vector<T>::iterator &a, const long i, const long j) { T tmp = *(a+i); *(a+i) = *(a+j); *(a+j) = tmp; }
Könnte funktionieren.
Hi Coda,
leider nicht. Der Compiler will das nicht so nehmen. Der vollständigkeitshalber hier der Fehleroutput:
../mextools/Utilities.h:60: error: `T' was not declared in this scope
../mextools/Utilities.h:60: error: template argument 1 is invalid
../mextools/Utilities.h:60: error: template argument 2 is invalid
../mextools/Utilities.h:60: error: expected `,' or `...' before '&' token
../mextools/Utilities.h:60: error: ISO C++ forbids declaration of `iterator' with no type
../mextools/Utilities.h: In static member function `static void My_Utilities::swap_(int)':
../mextools/Utilities.h:60: error: `T' undeclared (first use this function)
../mextools/Utilities.h:60: error: (Each undeclared identifier is reported only once for each function it appears in.)
../mextools/Utilities.h:60: error: expected `;' before "tmp"
../mextools/Utilities.h:60: error: `a' undeclared (first use this function)
../mextools/Utilities.h:60: error: `i' undeclared (first use this function)
../mextools/Utilities.h:60: error: `j' undeclared (first use this function)
../mextools/Utilities.h:60: error: `tmp' undeclared (first use this function)
Danke dennoch für deine Rückmeldung.
Beste Grüße
pajofego
Mach mal das template<class T> davor ;)
pajofego
2008-01-03, 15:37:16
Hi Coda,
hat der Compiler auch net akzeptiert. Dafür aber diese Änderung:
#if __GNUC__ <= 2
XY::swap(y.begin(), i,j);
#else
XY::swap(y.begin().base(), i,j);
#endif
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.