2013-05-09 7 views
8

Nel codice qui sotto, la lineaSi tratta di un bug VS2008? stile funzionale inizializzazione variabile

const char * const * eNames (names+cntNames); 

produce un errore C2061 in Visual Studio 2008:

errore di sintassi: 'identificatore' identificatore - Il compilatore trovato un identificatore dove non era previsto. Assicurarsi che l'identificatore sia dichiarato prima di usarlo. Un inizializzatore può essere racchiuso tra parentesi. Per evitare questo problema, racchiudere il dichiaratore tra parentesi o convertirlo in typedef. Questo errore potrebbe anche essere causato quando il compilatore rileva un'espressione come argomento del modello di classe ; usa typename per dire al compilatore che è un tipo.

Se cambio a

const char * const * eNames = names+cntNames; 

che non si lamenta. È un bug del compilatore? In caso contrario, perché la denuncia?

My About scatola dice: Versione 9.0.30729.1 SP

mio collega con GCC non vede questo errore.

#include <string> 
#include <algorithm> 
#include <functional> 
#include <iostream> 

namespace ns1 { 

    struct str_eq_to 
    { 
     str_eq_to(const std::string& s) : s_(s) {} 
     bool operator()(const char* x) const { return s_.compare(x)==0; } 
     const std::string& s_; 
    }; 

    static bool getNameIndex(const char * const * names, size_t cntNames, const std::string& nm, int &result) 
    { 
     const char * const * eNames (names+cntNames); //VS2008 error C2061: syntax error : identifier 'names' 
     const char * const * p = std::find_if(names, eNames, str_eq_to(nm)); 
     if(p==eNames) return false; 
     result = p-names; 
     return true; 
    } 

} //namespace ns1 


int main() { 

    const char * const names[] = {"Apple", "Orange","Plum"}; 
    std::string str = "Plum"; 
    int res; 

    ns1::getNameIndex(names, 3, str, res); 
    std::cout << str << " is at index " << res << std::endl; 
    return 0; 
} 
+7

VS 2008 ha cinque anni, geriatria positiva negli anni del compilatore e (ovviamente) da allora non ha tenuto il passo con gli sviluppi in C++. Vi consiglio di scaricare VS 2012 Express (a costo zero, richiede la registrazione) e provarlo lì. Se funziona, puoi supporre che VS 2008 sia sbagliato. – zwol

+2

Questo sembra sospetto come un problema relativo alla parsing. Prova un secondo set di paren: 'const char * const * eNames ((nomi + cntNames));' –

+0

@ MarkB - VS2008 quindi non ama le parentesi doppie e ottiene C2059 per ogni parentesi. –

risposta

4

Questo è sicuramente un bug del compilatore. Testimone:

extern char** a; 
typedef char* cp; 
char** c(a);  // error 
cp* c1(a);  // no error 
char** c2(c1); // error 
cp* n(0);   // no error 
char** n2(0);  // error