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

Кто-нибудь знает, почему следующее вызывает ошибку на 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 ]

4 голосов
/ 04 апреля 2009

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

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

1 голос
/ 04 апреля 2009

Какую версию компилятора / 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 , если хотите узнать больше.

0 голосов
/ 04 апреля 2009

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

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

0 голосов
/ 04 апреля 2009

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

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

EDIT После этой темы я обнаружил, что это на самом деле визуальная ошибка студии. Решение, которое вы нашли, кажется самым простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...