我正在尝试将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'
我有点看到这会如何混淆编译器。它实际上让我很困惑。 (memory)
new(memory) xml_attribute<Ch>
部分在那里做什么?
如果我删除了(memory)
部分,那么编译就可以了
此外,gcc编译它只是包含(memory)
。
修改
哦,我用new
重载了DEBUG_NEW
来做一些内存调试。 DEBUG_NEW
不支持展示位置。
答案 0 :(得分:3)
这是我的建议。 “内存”本身也被定义为宏,并且正在扩展而导致问题。因此,搜索#define.memory
(使用正则表达式)以查看内存是否定义为宏。
至于下一个陈述,这个表格:
new(allocator) ObjectType(...)
当您想使用自己的内存分配器为您分配内存时,使用。
希望这有帮助。
答案 1 :(得分:3)
你有#include&lt; new&gt;在那个档案中?
答案 2 :(得分:1)
这称为“放置新”。它在memory
中实例化xml_attribute的实例,而不是为它分配新的内存。参见:
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10
我不确定为什么VC2010的语法有问题。
答案 3 :(得分:1)
语法new (pointer) type( argument )
被称为 placement new ,它基本上代表了type
构造函数对先前分配的内存中给定argument
的调用pointer
。
语法尽可能正确。可能上面的几行有一个缺少的分号或语法错误,这使得解析器混乱,但memory
作为标识符是在前一行中定义的correclty使用的。 (并且它不是由实施语言保留的)