8

在下面的代码中,该行

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;
}
4

1 回答 1

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
于 2013-05-09T16:31:58.680 回答