摘要: 我有一个code snippet可以用g ++编译好,但不能用clang编译。
详情:
我有一个用g ++编译好的项目,但是当用clang编译时,我得到一个关于error: use of non-static data member
的错误。我试图创建一个可以证明问题的小测试用例,但是对于小测试用例,g ++给出了与clang相同的错误。
我发布了一个236行文件到pastebin,演示了这个问题: http://pastebin.com/DGnfxmYe
使用g ++ 4.6.3编译时,这很好用。但是当使用clang 3.2编译时,我收到以下错误消息:
myhashmap.hpp:169:29: error: use of non-static data member 'num_bins' of 'MyHashMap' from nested type 'iterator'
for (_index++; (_index < num_bins) && (bins[_index] == NULL); _index++)
^~~~~~~~
myhashmap.hpp:169:43: error: use of non-static data member 'bins' of 'MyHashMap' from nested type 'iterator'
for (_index++; (_index < num_bins) && (bins[_index] == NULL); _index++)
^~~~
myhashmap.hpp:171:17: error: use of non-static data member 'num_bins' of 'MyHashMap' from nested type 'iterator'
if (_index < num_bins) {
^~~~~~~~
myhashmap.hpp:172:17: error: use of non-static data member 'bins' of 'MyHashMap' from nested type 'iterator'
_theNode = bins[_index];
^~~~
查看代码,对我来说为什么clang会给出这些错误消息是有道理的。我不明白的是为什么g ++首先正确地编译了代码。我没有编写这段代码,但我想用clang干净地编译它。所以我试图准确理解它在做什么。我有兴趣理解为什么它用g ++编译但不用clang编译。 g ++是否以不同的方式解释c ++标准,或者是否有一些代码正在利用的g ++扩展?
答案 0 :(得分:1)
它失败了GCC 4.8(预发行版)所以我认为这是一个已修复的错误。我找不到相应的错误报告。
要修复代码,我认为您需要在迭代器中添加int _num_bins
成员,并将cotnainer的num_bins
传递给begin()
和end()
中的迭代器构造函数,所以它存储在每个迭代器对象中。
(另外,不要为不带参数的函数写(void)
,这是令人厌恶的。在C ++中,不带参数的函数写成()
)