2

我有一个模板实例化的宏定义,看起来大致如下:

#define INSTANTIATE_TEMPLATE(typeName) \
  template FooBarImpl<C##typeName>;

所以它并没有真正做太多。接下来我对这个宏有很多调用。

INSTANTIATE_TEMPLATE(OneType)
INSTANTIATE_TEMPLATE(AnotherType)
INSTANTIATE_TEMPLATE(TypeThree)

等等......这似乎工作正常。我只是尝试为仅包含最后几行的实例创建一个包含并将这些行替换为

#include "instantiations.hpp"

但是,这个新版本无法编译。当模板被实例化时,文件顶部的所有包含似乎都是不可见的。

引用MS 文档

#include 指令告诉预处理器处理指定文件的内容,就好像这些内容已经出现在源程序中指令出现的位置一样。

所以我认为这是预处理器评估#includes和宏的方式的某种排序问题。但它是如何真正起作用的,发生了什么?

4

3 回答 3

2

这很尴尬。

问题是我包含错误的名称。有两个文件的名称几乎相同,我自动完成了错误的名称,但从未注意到。名字的选择真的很糟糕(我不知道另一个存在),只有“......属性......”与“...... Attr......”不同。

我真的不确定要从中拿走什么。也许我应该使用“打开文档”快捷方式而不是单击打开选项卡。

于 2013-10-18T10:58:00.487 回答
0

我认为 Visual Studio 正在尝试编译 .hpp 文件,就好像它是 .cpp 文件一样。当它自己编译时,它没有从另一个文件中#included 时在它之前的#includes。

拉出 .hpp 的属性,并确保在 Configuration Properties -> General 下,它将 Item Type 列为“C/C++ header”。

于 2013-10-16T15:14:43.273 回答
0

您必须在定义INSTANTIATE_TEMPLATE.

于 2013-10-16T12:58:40.483 回答