在下面的代码中,行
const char * const * eNames (names+cntNames);
导致Visual Studio 2008中出现C2061错误:
语法错误:标识符'标识符' - 编译器找到了一个不期望的标识符。 确保在使用之前声明了标识符。 初始化器可以用括号括起来。 要避免此问题,请将声明符括在括号中或使其成为typedef。 当编译器将表达式检测为类时,也可能导致此错误 模板参数;使用typename告诉编译器它是一个类型。
如果我改为
const char * const * eNames = names+cntNames;
它没有抱怨。这是编译器错误吗?如果没有,为什么要投诉?
我的关于框说:版本9.0.30729.1 SP
我与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 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;
}
答案 0 :(得分:4)
这绝对是编译器错误。证人:
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