使用clang而非g ++的非静态数据成员错误

时间:2013-01-14 22:49:10

标签: g++ clang

摘要: 我有一个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 ++扩展?

1 个答案:

答案 0 :(得分:1)

它失败了GCC 4.8(预发行版)所以我认为这是一个已修复的错误。我找不到相应的错误报告。

要修复代码,我认为您需要在迭代器中添加int _num_bins成员,并将cotnainer的num_bins传递给begin()end()中的迭代器构造函数,所以它存储在每个迭代器对象中。


(另外,不要为不带参数的函数写(void),这是令人厌恶的。在C ++中,不带参数的函数写成()