【发布时间】:2015-10-22 08:55:50
【问题描述】:
由于某种原因,我收到此错误消息
'void (S::* const)()' 和 'void (S::* const)()' 类型的无效操作数到二进制 'operator
对于这个代码sn-p:
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
struct S
{
void f() {}
};
typedef void(S::*tdef)();
int main()
{
boost::tuple<tdef> t1(&S::f);
boost::tuple<tdef> t2(&S::f);
return t1 < t2;
}
Boost 文档对在元组中使用成员函数指针(除了它们是有效元素)非常守口如瓶,所以我真的不知道可能是什么问题或那些“const”限定符是如何进入表达。
有什么提示吗?
【问题讨论】:
-
你想用
operator<实现什么? c++ 中的成员函数指针没有关系可比性。 -
boost::tuples 按字典顺序进行比较。因此t1 < t2实际上是&S::f < &S::f,编译器抱怨没有二进制operator<来比较这些类型。 -
我认为将 &S::f 的参数类型推导出为 void (S::* const)() 是有道理的。函数的地址(在本例中为 S::f)是一个常数。您可以尝试为类型重载全局运算符
-
目标是一个以 mfptr 作为 map 键的类,但我想我会跳过那个成员,因为我没有更好的主意,我不想使用 hacks。感谢所有的cmets!
标签: c++ boost tuples member-function-pointers c++98