Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » const std::vector<std::string>& args - Warum geht das nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.06.2018, 11:38 Uhr
Getit



Ich habe aus einem Buch ein Beispiel abgetippt.

Bei meiner Frage geht es weniger um das Beispiel, sondern mehr um einen Funktionsaufruf.
Deshalb poste ich nur einen Auszug:


C++:
bool process(const std::vector<std::string>& args) {
...
}

int main(int argc, char* arg[]) {
  bool result = process({argv + 1, argv + argc});  // es geht nur um diesen Fktaufruf
}


Das ganze kompiliere ich so:
Das war

Code:
g++ -std=c++17 test.cpp -o test.o



Wenn ich den Fktaufruf so ändere

C++:
process({argv + 1})



Erhalte ich folgende Fehlermeldung:

Code:
test.cpp:42:17: error: no matching function for call to 'process'
  bool result = process({argv + 1});
                ^~~~~~~
test.cpp:21:6: note: candidate function not viable: cannot convert initializer list argument to 'const std::vector<std::string>' (aka 'const vector<basic_string<char, char_traits<char>, allocator<char> >
      >')
bool process(const std::vector<std::string>& args) {
     ^



Ich verstehe in dieser Fehlermeldung nur, dass keine passende Methodensignatur gefunden wird.

Warum???

Was ist an

C++:
process({argv + 1, argv + argc})


und

C++:
process({argv + 1})


-außer das die Fkt. beim 1. mal mit 2 Args und beim 2. mal mit 1Args aufgerufen wird- unterschiedlich?

Dieser Post wurde am 08.06.2018 um 11:39 Uhr von Getit editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2018, 21:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

naja argv ist "const char *" und nicht std::string
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.06.2018, 12:30 Uhr
ao

(Operator)


Das sind nicht zwei Argumente, das ist eine Initialisierungsliste, erkennbar an den geschwungenen Klammen.

Da wird ein namenloses temporäres Objekt vom Typ std::initializer_list<std::string> erzeugt, und zwar aus den C-Strings argv[1] bis argv[(argc-1)]. Mit dieser Liste wird dann der std::string erzeugt, der in process hineingegeben wird.

Der fehlerhafte Ausdruck mit dem einen Pointer ergibt keine gültige Intialisierungsliste, darum schlägt das fehl.

Wenn du nur das 1. Argument an process übergeben willst, dann geht das so:

process (argv + 1);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.06.2018, 12:49 Uhr
Getit




Zitat von ao:
Das sind nicht zwei Argumente, das ist eine Initialisierungsliste, erkennbar an den geschwungenen Klammen.

Da wird ein namenloses temporäres Objekt vom Typ std::initializer_list<std::string> erzeugt, und zwar aus den C-Strings argv[1] bis argv[(argc-1)]. Mit dieser Liste wird dann der std::string erzeugt, der in process hineingegeben wird.

Der fehlerhafte Ausdruck mit dem einen Pointer ergibt keine gültige Intialisierungsliste, darum schlägt das fehl.

Wenn du nur das 1. Argument an process übergeben willst, dann geht das so:

process (argv + 1);


Vielen Dank für die ausführliche Erklärung.


Zitat:

...bis argv[(argc-1)] ...
sollte das nicht bis argv[argc] gehen?




Zitat:

naja argv ist "const char *" und nicht std::string


????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: