【发布时间】:2012-02-05 09:31:18
【问题描述】:
我的代码是这样的
#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)
...
typedef vector<long> vl;
vl numbers;
...
tr(numbers, j) { // this is line 95
...
}
代码对我来说看起来不错,但对我的编译器来说却不是!无情地,我得到以下错误:
code.cpp:在函数'int main()'中:
code.cpp:95:9: 错误:实例化后“std::vector::iterator”的特化
code.cpp:95:9: 错误:'typeof' 之前的预期主表达式
code.cpp:95:9: 错误:在“typeof”之前需要“;”
code.cpp:95:9: 错误:“j”的名称查找已更改为 ISO“for”范围
code.cpp:95:9: 注意:(如果你使用'-fpermissive' G++ 将接受你的 代码)
code.cpp:95:9: 错误:'j!= 中的'operator!=' 不匹配 numbers.std::vector<_tp _alloc>::end with _Tp = long int, _Alloc = std::allocator, std::vector<_tp _alloc>::iterator = __gnu_cxx::__normal_iterator >,类型名 std::_Vector_base<_tp _alloc>::_Tp_alloc_type::pointer = 长整数*'
我在这里错过了什么?
【问题讨论】:
-
@DeadMG,我理解对宏的普遍看法。但在这种情况下,实际问题是什么?除了与
c被多次评估这一事实相关的风险之外。以及typeof的不可移植性。 -
什么是 typeof 关键字??第一次见。。
-
如果您能够使用 C++11,请查看
auto和decltype而不是(显然)编译器扩展。 -
@codekiddy:这是获取表达式类型的 GCC 扩展。它与 C++11 中的
decltype几乎相同,尽管我怀疑会有一些细微的差别。