2

摘要:我有一个代码片段,可以用 g++ 编译,但不能用 clang。

详情

我有一个项目可以用 g++ 很好地编译,但是当用 clang 编译时,我得到一个关于error: use of non-static data member. 我试图创建一个小测试用例来演示问题,但是对于小测试用例 g++ 给出了与 clang 相同的错误。

我已经向 pastebin 发布了一个 236 行文件来演示该问题: 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++ 扩展?

4

1 回答 1

1

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

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


(此外,不要为不(void)带参数的函数编写,那是可憎的。在 C++ 中,编写了不带参数的函数()

于 2013-01-15T21:18:20.747 回答