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;
}
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
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));' –
@MarkB - VS2008 wtedy nie lubi podwójnych nawiasów i otrzymuje C2059 dla każdego nawiasu. –