BOOST_FOREACH: что является ошибкой при использовании этого контейнера STL?

Кто-нибудь знает, почему следующее генерирует ошибку на VC9?

class Elem;
class ElemVec : public vector<Elem>
{
    public:
        void foo();
};

void ElemVec::foo()
{
    BOOST_FOREACH(Elem& elem, *this)
    {
        // Do something with elem
    }
    return;
}

Я получаю ошибку:

error C2355: 'this' : can only be referenced inside non-static member functions

Единственное (взломанное) решение, которое у меня есть сейчас, которое компилируется без ошибок:

void ElemVec::foo()
{
    ElemVec* This = this;
    BOOST_FOREACH(Elem& elem, *This)
    {
        // Do something with elem
    }
    return;
}

4 ответа

Решение

Какой компилятор / версию Boost вы используете? Я могу без проблем скомпилировать следующее (VS2005/Boost 1.38):

#include <boost/foreach.hpp>
using namespace std;
struct xxx : std::vector<int>
{
    void test()
    {
        BOOST_FOREACH(int x, *this)
        {
        }
    }
}; 

int main(void) {
    xxx x;
    x.test();
    return 0;
}

Поиск Boost bugbase, если вы хотите больше подробностей.

Вы не должны наследовать от контейнеров STL. Это не полиморфные классы, и это причина BOOST_FORACH не может обработать ваш производный класс.

Попробуйте вместо этого использовать агрегацию.

Я никогда не видел эту ошибку. Я предполагаю, что это происходит от реализации макроса BOOST_FOREACH.

Могу я спросить, почему вы создаете класс на основе вектора<...> и не имеете векторной переменной-члена?

РЕДАКТИРОВАТЬ После этой темы я обнаружил, что это на самом деле визуальная ошибка студии. Решение, которое вы нашли, кажется самым простым.

Хм, все успешно скомпилировано на моем компиляторе msvc (2005).

Может быть, у вас есть какая-то ошибка, но вы ее исправили или избежали, когда создавали свой пример.

Другие вопросы по тегам