Ошибка нестатического члена данных с clang, но не с g++

Вывод. У меня есть фрагмент кода, который отлично компилируется с помощью 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++ стандарт С++ по-другому или есть какое-то расширение g++, которое использует код?


person Gabriel Southern    schedule 14.01.2013    source источник


Ответы (1)


Он не работает с GCC 4.8 (предварительный выпуск), поэтому я предполагаю, что это ошибка, которая была исправлена. Однако я не могу найти соответствующий отчет об ошибке.

Чтобы исправить код, я думаю, вам нужно добавить член int _num_bins в итератор и передать num_bins cotnainer конструктору итератора в begin() и end(), чтобы он сохранялся в каждом объекте итератора.


(Кроме того, не пишите (void) для функции без аргументов, это мерзость. В C++ функция без аргументов пишется ())

person Jonathan Wakely    schedule 15.01.2013