2013-05-09 32 views
8

W poniższym kodzie, liniaCzy to błąd VS2008? styl funkcjonalny zmienna inicjalizacji

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

skutkuje błędem C2061 w Visual Studio 2008:

Błąd składni: identyfikator „identyfikator” - Kompilator znaleźć identyfikator gdzie nie było to oczekiwane. Upewnij się, że identyfikator został zadeklarowany przed użyciem. Inicjator może być ujęty w nawiasy. Aby uniknąć tego problemu, należy umieścić deklarator w nawiasach lub wpisać go jako typedef. Ten błąd może być również spowodowany, gdy kompilator wykryje wyrażenie jako argument szablonu klasy ; użyj komendy type, aby poinformować kompilator, że jest to typ.

Jeśli zmieni się

const char * const * eNames = names+cntNames; 

nie narzekać. Czy jest to błąd kompilatora? Jeśli nie, dlaczego skarga?

My O box mówi: Wersja 9.0.30729.1 SP

Mój kolega z GCC nie widzi tego błędu.

#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 ma pięć lat, jest pozytywnie geriatryczny w latach kompilacji i (oczywiście) nie nadąża za rozwojem C++ od tego czasu. Polecam pobrać VS 2012 Express (zero kosztów, wymaga rejestracji) i spróbować tam. Jeśli to działa, możesz założyć, że VS 2008 był nieprawidłowy. – zwol

+2

Wygląda to podejrzanie jak na najbardziej dokuczliwy problem związany z analizą składni. Wypróbuj drugi zestaw parenów: 'const char * const * eNames ((names + cntNames));' –

+0

@MarkB - VS2008 wtedy nie lubi podwójnych nawiasów i otrzymuje C2059 dla każdego nawiasu. –

Odpowiedz

4

To zdecydowanie jest błąd kompilatora. Świadek:

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