这是VS2008的错误吗?功能样式变量初始化

时间:2013-05-09 14:06:48

标签: c++ most-vexing-parse

在下面的代码中,行

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

1 个答案:

答案 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