2016-08-03 21 views
1

Ich habe den folgenden Code, mit Doppel für den Umgang:Fehler: 'const string {aka const std :: __ cxx11 :: basic_string <char>}' vorbei "dieses Argument

static bool 
double_param(const char ** p, double * ptr_val) 
{ 
    char *end; 
    errno = 0; 
    double v = strtod(*p, &end); 
    if (*p == end || errno) return false; 
    *p = end; 
    *ptr_val = v; 
    return true; 
} 

Dieser Code verwendet wird, um zu überprüfen ob übergeben Doppel Parameter wie so ungültig ist:

if (!double_param(&p, &b1)) //p is pointer and b1 is parameter. 
     //throw error; 

Und, ich brauche für den Umgang mit einer Schnur von 3 Zeichen lang einen gleichwertigen Code zu schreiben. Ich habe dies auf meinem eigenen bekommen:

static bool 
string_param(const char ** p, const string * ptr_val) 
{ 
    char *end; 
    errno = 0; 
    int v = strtol(*p, &end, 10); 
    if (*p == end || errno) return false; 
    *p = end; 
    *ptr_val = v; 
    return true; 
} 

aber ich habe den folgenden Compiler-Fehler:

error: passing ‘const string {aka const std::__cxx11::basic_string<char>}’ as ‘this’ argument discards qualifiers [-fpermissive] 
(*ptr_val) = v; 
      ^

Irgendwelche Vorschläge, um diese Fehler werden geschätzt zu bekommen. Bitte weisen Sie auch auf den Fehler in meinem Code hin und erklären Sie ein wenig, damit ich besser verstehen und lernen kann. Danke im Voraus.

+1

Wenn Sie '* ptr_val' zuweisen, kann es in der Signatur der Funktion nicht 'const' sein. Du musst einen auswählen, wird es sich ändern (nicht const) oder nicht (const)? – SirGuy

+0

+1 GuyGreer Oh, warum setze ich immer const mit String ein. Fast ein Muskelgedächtnis. Danke, dass du darauf hingewiesen hast. Das war buchstäblich die einzige Sache, die Kompilierungsfehler verursachte. – Duh

Antwort

2

*ptr_val ist ein Zeiger auf eine const string. Sie versuchen, den Wert eines zu ändern, was Sie natürlich nicht tun können.

Sie können stattdessen ein const Zeiger wie folgt tun: string * const ptr_val

Dies bedeutet, dass Sie den Wert der Daten ändern kann der Zeiger auf zeigt, aber Sie können nicht ändern, was der Zeiger auf.

+2

Oder einfach den Zeiger los und pass auf Referenz. – NathanOliver