用boost :: variant元素填充的std :: set不能后续排序?

时间:2009-04-14 19:57:25

标签: c++ boost

typedef boost::variant<long long,double,string> possibleTypes ;

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

当我尝试编译时,我在一些库标题中出现了一堆错误 但是,如果我删除第三行(descSet的那一行),代码编译就好了。

有什么问题?不能将boost :: variant对象按照后代顺序排序??

修改
我正在使用Visual Studio 2005和Boost 1.38.0以及以下命令行:

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

EDIT2 正如Doug T所建议的,如果我定义这个:

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

3 个答案:

答案 0 :(得分:3)

它似乎是&lt; operator是为boost :: variant定义的,但不是&gt;运营商。因此也许std :: less&lt;&gt;但不是std :: greater&lt;&gt;

请参阅here

我会尝试定义一个免费的&gt;操作

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

答案 1 :(得分:1)

您需要拥有更大的运算符。如果 possibleTypes 没有提供,可以定义像Doug建议的免费版本或尝试使用Boost operators

答案 2 :(得分:0)

正如所建议的,如果我定义这个:

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