Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.02.2014, 19:42

MinGW C++: Vector iterator

Liebe Community,

heute wollte ich ein Stück Code, das ich für Visual Studio 2013 geschrieben habe, unter CodeBlocks auf MinGW (GNU CC) testen. Allerdings bekomme ich einen Haufen Fehler, der zwar im Endeffekt immer der gleiche ist, aber den ich - so blöd das auch klingen mag - nicht ganz verstehe:

Zitat


Building CXX object Core/CMakeFiles/Core.dir/src/Core/String/UTF8String.cpp.obj
cd /d C:\Users\euaconlabs\Documents\Engine\Builds\MinGW\Core && C:\PROGRA~2\CODEBL~1\MinGW\bin\G__~1.EXE @CMakeFiles/Core.dir/includes_CXX.rsp -o CMakeFiles\Core.dir\src\Core\String\UTF8String.cpp.obj -c C:\Users\euaconlabs\Documents\Engine\Source\Core\src\Core\String\UTF8String.cpp
C:\Users\euaconlabs\Documents\Engine\Source\Core\src\Core\String\UTF8String.cpp: In member function 'Core::_String::UTF8String& Core::_String::UTF8String::Insert(U32, char)':
C:\Users\euaconlabs\Documents\Engine\Source\Core\src\Core\String\UTF8String.cpp:263:29: error: no matching function for call to 'Core::_String::UTF8String::Insert(__gnu_cxx::__normal_iterator<Core::_String::UTF8Codepoint*, std::vector<Core::_String::UTF8Codepoint> >, const char&)'
Insert((Begin() + pos), c);


Dieser wird bei folgendem Code-Stück geworfen:

C-/C++-Quelltext

1
2
3
4
5
UTF8String& UTF8String::Insert(const U32 pos, const char c)
{
    Insert(Begin() + pos, c);
    return *this;
}


Unter Microsoft Visual Studio 2013 kompiliert alles fehler- und warnungsfrei, daher weiß ich nicht ganz was an dem Funktionsaufruf falsch sein soll, zumal er in der gleichen Header-Datei, wie die aufrufende Funktion folgendermaßen deklariert wurde:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//////////////////////////////////////////////////////////////
/// \brief Inserts the given character at the position into
///        the string.
/// \param pos Where to insert into the string.
/// \param c The character to insert.
/// \returns Iterator
//////////////////////////////////////////////////////////////
Iterator Insert(Iterator& pos, const char c);


Der Typ Iterator ist lediglich das folgende Typedef:

C-/C++-Quelltext

1
2
3
4
typedef std::vector<CharType>::iterator Iterator;
typedef std::vector<CharType>::const_iterator ConstIterator;
typedef std::vector<CharType>::reverse_iterator ReverseIterator;
typedef std::vector<CharType>::const_reverse_iterator ConstReverseIterator;


U32 ist außerdem lediglich ein 'unsigned' Integer-Typ bestehend aus 32-Bits.

Mich verwundert wirklich, dass GNU CC die Funktion nicht zu finden scheint.

Ich hoffe jemand weiß, woran der Fehler liegt. Vielleicht stelle ich mich auch nur zu blöd an :wacko:.

Liebe Grüße,
~ EuadeLuxe ~

2

26.02.2014, 00:06

Hallo!

Der Parameter Iterator& pos der Funktion Insert ist eine Lvalue-Referenz. Der Ausdruck Begin() + pos ist hingegen ein Rvalue, weil daraus ein temporärer Wert hervorgeht. Der Rvalue kann an dieser Stelle nicht in eine Lvalue-Referenz konvertiert werden.

Hierfür gibt es mehrere Lösungen:
  • Den Wert als Kopie anstatt Referenz übergeben.
  • Den Parameter als const Lvalue-Referenz deklarieren.
  • Den Parameter als Rvalue-Referenz deklarieren.
In diesem Fall halte ich die erste Lösung für am geeignetsten.

Ich mag mich irren, aber meiner Einschätzung nach hat MinGW hier korrekt reagiert.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

26.02.2014, 07:03

Na ja, das hängt sicher auch davon ab, was "Iterator+x" für einen Rückgabewert liefert - also ob einen lvalue oder einen rvalue ;)
Mein persönlicher Favorit für die Lösung ist der alteingesessene "const &" als Parameter.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

28.02.2014, 00:22

Danke, für die Antworten! Ich werde mich nachdem ich aus dem Urlaub zurückbin gleich mal dransetzen!

Liebe Grüße,
~ EuadeLuxe ~

Werbeanzeige