2009-04-04 4 views
4

誰もVC9で次のエラーが発生する理由を知っていますか?BOOST_FOREACH:これをSTLコンテナで使用する際のエラーは何ですか?

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; 
} 

答えて

1

使用しているコンパイラ/ブーストのバージョンを教えてください。私は(VS2005/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; 
} 

はブーストbugbaseを検索します。

+0

それを指摘してくれてありがとう。私はBoost 1.35で、私は1.38にアップグレードし、あなたに戻ってきます。 –

+0

ブースト1.38でエラーがなくなりました。どうもありがとう! :-) –

0

私はそのエラーを見たことがなかったです。私はそれがBOOST_FOREACHマクロの実装から来ていると思います。

ベクトル< ...>に基づいてクラスを作成していて、ベクトルメンバー変数を持たない理由を尋ねることがありますか? this thread

EDIT 、私は、これは実際にはVisual Studioのバグであることが分かりました。あなたが見つけた解決策は最も簡単なようです。

+0

この場合、私は必要ないくつかの機能を追加してベクトルを拡張しています。 –

+0

一般的に悪い考えです - 継承を使用するのではなく、フリーの関数を記述します。 –

+0

ベクトルから継承するのは、非仮想的なデストラクタであるために一般的に悪いです。あなたがこれを知っている限り、拡張は正常になるはずです。 – Indy9000

4

STLコンテナから継承しないでください。これらはポリモーフィッククラスではないので、BOOST_FORACHは派生クラスを処理できません。

代わりに集約を使用してください。

+1

このようなクラスにBOOST_FOREACHが適用されないのは何ですか? –

0

まあ、すべて私のmsvc(2005)コンパイラでうまくコンパイルされています。

多分あなたはいくつかのエラーがありますが、あなたの例が作成されたときにそれを修正したり、回避したりしました。

+0

ありがとうございました、 "気まぐれに"指摘されているように、それはBoostの問題であることが判明しました。このエラーは、最新のBoost v1.38で発生しなくなりました。 –

関連する問題