BOOST_FOREACH:使用STL容器有什么错误?

时间:2009-04-04 09:18:48

标签: c++ visual-c++ boost

有谁知道为什么以下在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 个答案:

答案 0 :(得分:4)

您不应该继承STL容器。这些不是多态类,而是BOOST_FORACH无法处理派生类的原因。

尝试使用聚合。

答案 1 :(得分:1)

您使用的是哪个编译器/ 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

答案 2 :(得分:0)

我从未见过那个错误。我猜它来自BOOST_FOREACH宏的实现。

我可以问你为什么要根据vector&lt; ...&gt;创建一个类吗?并且没有矢量成员变量?

修改this thread之后,我发现这实际上是一个视觉工作室错误。您找到的解决方案似乎是最简单的。

答案 3 :(得分:0)

嗯,所有在我的msvc(2005)编译器上编译成功。

也许你有一些错误,但在创建你的例子时修复或避免它。