2009-04-14 10 views
1
typedef boost::variant<long long,double,string> possibleTypes ; 

set<possibleTypes,less<possibleTypes> > ascSet ; 
set<possibleTypes,greater<possibleTypes> > descSet ; 

コンパイルしようとすると、いくつかのライブラリヘッダーにエラーが発生します。
しかし、3行目(descSetのもの)を削除しても、コードはうまくコンパイルされます。boost :: variant要素でいっぱいのstd :: setを子孫でソートすることはできませんか?

問題が何ですか? boost :: variantオブジェクトを子孫の順序でソートすることはできませんか?

編集:
私は、Visual Studio 2005を使用し、1.38.0を高めることだし、次のコマンドライン:それはダグTにより、提案されたとして

cl /EHsc /I"C:\boost_1_38_0" test.cpp 

EDIT2 、もしIこれを定義:

bool operator>(const possibleTypes& a, const possibleTypes& b){ 
    return b < a ; 
} 

その後、次のコードはコンパイルされません。

possibleTypes pt1="a", pt2="b" ; 
greater<possibleTypes> func ; 
cout << func(pt1,pt2) << endl ; 

しかし、このコードはうまくコンパイル:

possibleTypes pt1="a", pt2="b" ; 
cout << (pt1 > pt2) << endl ; 

誰もが理由を理解するために私を助けてもらえます?

私は<オペレータがブースト::バリアントではなく>オペレータのために定義されて表示されますVC++ 2005とGCC 3.4.6で

+0

使用しているBoostのバージョンは?私はあなたのコードを1.38.0とVC++ 9.0で試してみましたが、問題なくコンパイルしました。 – Ferruccio

+0

本当ですか?これはコピー機のバージョンでなければなりません(私は自分の投稿を更新しました) – GetFree

+0

少なくとも最初のエラーメッセージは提供できますか?私。 descSetが不適切に定義された結果ではなく、宣言自体に関するものです。 – MSalters

答えて

0

は、それは、提案されたとして

possibleTypes pt1="a", pt2="b" ; 
greater<possibleTypes> func ; 
cout << func(pt1,pt2) << endl ; 

しかし、このコードはうまくコンパイル:

possibleTypes pt1="a", pt2="b" ; 
cout << (pt1 > pt2) << endl ; 

誰も私がなぜそれを理解するのを助けることができますか?

私はVC++ 2005とGCCを試しました。3.4.6

+1

名前空間の昇格で名前空間の昇格{namespace boost {bool operator>(const possibleTypes&a、const possibleTypes&b)...} 。コンパイラは演算子>の間違った場所を探していますが、個人的には2つの可能な型引数を取る演算子を探すと期待します。 –

+1

Nope - 引数に依存する検索。どこでも検索するつもりはなく、呼び出し元の名前空間(std :: greater)と引数の名前空間(boost :: variant)を調べます。 2番目のケースでは、呼び出し元の名前空間は(おそらく)グローバル名前空間です。 – MSalters

+0

ありがとう、マックス。この問題は、ブーストネームスペースにoperator>を追加することによって修正されました。 ルールを明確にするために、MSaltersに感謝します。 – GetFree

3

を試してみました。このように、おそらくのstd ::動作しますが、はstdない> <以下here

を参照してください

<>

::大きい私は自由>演算子を定義しようとするだろう。

bool operator > (boost::variant<...> lhs, boost::variant<..> rhs) 
{ 
    return (rhs < lhs) // thanks Chris Jester Young 
} 
+0

なぜ簡単ではないのでしょうか?返すrhs

+0

ええ、それはもっと簡単でしょう:) –

1

大きな演算子を使用する必要があります。 可能なタイプに提供されていない場合は、Dougのように空きを定義するか、Boost operatorsを使用してください。その後

bool operator>(const possibleTypes& a, const possibleTypes& b){ 
    return b < a ; 
} 

次のコードはコンパイルされません:私はこれを定義する場合