5

我正在尝试将 rapidxml 包含到我当前的项目中。但是,它不会构建。

Visual Studio 会抱怨这段代码(rapidxml.hpp:419+451):

419: void *memory = allocate_aligned(sizeof(xml_attribute<Ch>));
420: xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;

编译器会说

rapidxml.hpp(420):错误 C2061:语法错误:标识符“内存”

我有点明白这会如何混淆编译器。它实际上也让我很困惑。在那里做的(memory)部分是new(memory) xml_attribute<Ch>什么?

如果我删除那(memory)部分,它编译就好了。
此外,gcc 可以很好地编译它(memory)

编辑:
哦,我超载newDEBUG_NEW做一些内存调试。DEBUG_NEW不支持放置新。

4

4 回答 4

3

你在那个文件中有#include <new> 吗?

于 2011-01-21T08:53:28.947 回答
3

这是我的建议。“内存”本身在某处也被定义为宏,并且正在扩展,从而导致问题。因此搜索#define.memory(使用正则表达式)以查看内存是否定义为宏。

至于下一条语句,这种形式:

new(allocator) ObjectType(...)

当您想使用自己的内存分配器为您分配内存时使用。

希望这可以帮助。

于 2011-01-21T08:46:44.237 回答
1

该语法new (pointer) type( argument )称为placement new,它基本上表示使用type给定的构造函数调用argument先前分配的内存pointer

就其显示的内容而言,语法是正确的。也许上面几行缺少分号或语法错误,这使解析器感到困惑,但memory作为标识符是在前一行中定义的正确使用。(并且它不被语言保留用于实现)

于 2011-01-21T08:52:10.790 回答
1

这称为“放置新”。它实例化 xml_attribute 的一个实例,memory而不是为其分配新内存。看:

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

我不确定为什么 VC2010 的语法有问题。

于 2011-01-21T08:49:57.063 回答