【发布时间】:2012-04-25 21:20:21
【问题描述】:
摘自本书 - C++ 模板:David, Nicolai 的完整指南
因此,模板被编译两次:
- 如果不进行实例化,则会检查模板代码本身的语法是否正确。发现语法错误,例如缺失 分号。
- 在实例化时,会检查模板代码以确保所有调用都有效。发现无效调用,如 不支持的函数调用。
保持第一点,我写了-
template<typename T>
void foo( T x)
{
some illegal text
}
int main()
{
return 0;
}
它在 Visual Studio 2010 上构建良好,没有任何警告,优化关闭。但是,it failed on gcc-4.3.4。哪一个符合 C++ 标准?即使没有模板实例化,模板代码是否也必须编译?
【问题讨论】:
-
VC++ 没有实现两阶段名称查找。从来没有,可能在很长时间(如果有的话)都不会。
-
我很高兴他们在宽大方面犯了错误。
-
@Seth :我不是——这让编写跨平台代码变得更加困难,因为在您使用更兼容的编译器编译代码之前,您不会看到错误。
-
@ildjarn 仅当您从未实例化模板时。此外......只需在更兼容的编译器上测试它。
-
@Seth : 不,还有其他副作用,例如无法识别依赖类型,因此 VC++ 可以让您摆脱很多缺失的
template和typename关键字兼容的编译器没有。并且在更合规的编译器上进行测试当然是不切实际的(Windows 上的 Clang 还不是很漂亮),尽管目前是必要的。
标签: c++ visual-studio-2010 templates visual-c++ gcc