В приведенном ниже коде строка
const char * const * eNames (names+cntNames);
приводит к C2061 ошибка в Visual Studio 2008:
синтаксическая ошибка: идентификатор «идентификатор» —
Компилятор нашел идентификатор, где он не ожидался.
Убедитесь, что идентификатор объявлен, прежде чем использовать его.
Инициализатор может быть заключен в круглые скобки.
Чтобы избежать этой проблемы, заключите декларатор в круглые скобки или сделайте его typedef.
Эта ошибка также может быть вызвана, когда компилятор обнаруживает выражение как класс
аргумент шаблона; используйте typename, чтобы сообщить компилятору, что это тип.
Если я изменю на
const char * const * eNames = names+cntNames;
это не жалуется. Это ошибка компилятора? Если нет, то почему жалоба?
В поле «О себе» написано: SP версии 9.0.30729.1
Мой коллега из GCC не видит эту ошибку.
#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 ns1int 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;
}
Это определенно ошибка компилятора. Свидетель:
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
Других решений пока нет …