在下面的代码中,该行
const char * const * eNames (names+cntNames);
在 Visual Studio 2008 中导致C2061错误:
语法错误:标识符 'identifier' - 编译器在不期望的地方找到了标识符。确保在使用之前声明了标识符。初始化器可以用括号括起来。为避免此问题,请将声明符括在括号中或使其成为 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;
}