我继承了一个在 VS2005 中编译良好的 C++ 项目,但是当我在 VS2010 中打开它时,我得到了很多这样的 IntelliSense 错误:
IntelliSense:表达式必须具有整数或枚举类型
实际上在项目中打开其中一个 cpp 文件似乎会导致出现错误。
这是导致错误的行类型的示例。
if (pInfoset->Fields->Item["Contact"]->Size <= 0)
我继承了一个在 VS2005 中编译良好的 C++ 项目,但是当我在 VS2010 中打开它时,我得到了很多这样的 IntelliSense 错误:
IntelliSense:表达式必须具有整数或枚举类型
实际上在项目中打开其中一个 cpp 文件似乎会导致出现错误。
这是导致错误的行类型的示例。
if (pInfoset->Fields->Item["Contact"]->Size <= 0)
我认识代码,那是 ADO 语法。您正在与一种非标准语言扩展作斗争,这种扩展在过去十年中使 COM 编程变得更容易。它允许使用声明符在 C++ 类上声明属性__declspec(property)
。一个例子:
class Example {
public:
int GetX(const char* indexer) { return 42;}
void PutX(const char* indexer, int value) {}
__declspec(property(get=GetX,put=PutX)) int x[];
};
int main()
{
Example e;
int value = e.x["foo"]; // Barf
return 0;
}
IntelliSense 解析器在 VS2010 中彻底检修,并使用 Edison Design Group 前端重新实现。它只是与语言扩展不够兼容,并且会超出索引运算符的使用。我会说,他们可以原谅。
您可以在 connect.microsoft.com 上对此进行投诉,但我不希望出现奇迹。这个问题在 VS2012 中仍然存在。get_Item("Contact")
在您的情况下,一种解决方法是停止使用虚拟属性并改用 getter 函数。
根据您在评论中所说的内容(关于 IntelliSense 找不到 .tli 文件),一旦您构建了解决方案,错误应该会消失。.tli(和 .tlh)文件是由 #import 指令创建的自动生成的文件,但显然您需要编译具有 #import 指令的文件才能生成这些文件(仅 IntelliSense 不会生成他们)。