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).
Может быть, у вас есть какая-то ошибка, но вы ее исправили или избежали, когда создавали свой пример.