我很困惑为什么无法使用二元运算符<比较指向成员的指针?
class Point3d{
protected:
//..
public:
float x;
static list<Point3d*> *freeList;
public:
float y;
static const int chunkSize = 250;
public:
float z;
};
和模板:
template< class class_type, class data_type1, class data_type2 >
char* access_order(data_type1 class_type:: *mem1, data_type2 class_type:: *mem2)
{
return
mem1 < mem2 ?
"member 1 accurs first":
"member 2 accurs first";
}
当我调用access_order时如下:
access_order(&Point3d::z, &Point3d::y);
g ++报道:
"invalid operands of types ‘float Point3d::*’ and ‘float Point3d::*’ to binary ‘operator<’"
有没有办法比较指向成员的指针,我的意思是不平等的比较,以及如何?
答案 0 :(得分:1)
出于同样的原因,你无法比较一般的指针。唯一的 如果两个数据指针指向,则支持的顺序比较 进入同一个数组。否则,比较的结果是 不明;不需要编译器使运算符“工作” 任何合理的方式。 (确保这里的总订单需要额外的 计算某些架构。)因为没有案例你可以得到 指向成员的指针的结果,标准不允许 它们作为运营商的参数。
如果您需要总排序,std::less
等。保证提供
它。包括,如果我正确理解标准,成员指针。
(尽管提供指向成员函数的指针的总排序
可能会非常昂贵。)然而,即使这样,这个顺序
可能是任意的;它肯定不需要反映任何
在内存中排序。
答案 1 :(得分:1)
您可以比较对象成员的地址:
A a;
if (std::less<void*>()(&a.a, &a.b))
std::cout << "a precedes b\n";
else
std::cout << "a follows b\n";
答案 2 :(得分:0)
如果Point3d重载&lt;然后尊重他们并进行比较,
返回 * mem1&lt; * mem2? “会员1先诅咒”: “成员2诅咒第一”;
或更改签名
char * access_order(data_type1 class_type ::&amp; mem1,data_type2 class_type ::&amp; mem2) char * access_order(data_type1 class_type :: mem1,data_type2 class_type :: mem2)
您想要对实际内存地址进行比较吗?
答案 3 :(得分:0)
指向成员的指针本身并不指向某些记忆。它们只是标签。你可以用它们做的唯一事情就是用操作符.*
或->*
将它们转换为对给定对象的pointee值的引用,或者存储在另一个指向成员变量的指针中。
struct A
{
int a;
float b;
};
A a;
int A::* p2m = &A::a;
int A::* p2m2 = p2m;
int & realPointer = a.*p2m;
注意,您只能比较相同类型的指针,因此您无法将指向A::a
(int A::*
)的指针与指向A::b
的指针进行比较(float A::*
)