【发布时间】:2013-05-02 13:10:48
【问题描述】:
//#define NOT_WORKS
#define HOW(X) 0
struct A {
};
struct B {
A a;
};
struct C {
B b;
};
int main(int argc, char **argv) {
A B::*ba = &B::a; // ba is a pointer to B::a member
B C::*cb = &C::b; // cb is a pointer to C::b member
#ifdef NOT_WORKS
{ A C::*ca = &C::b::a; } // error: Symbol a could not be resolved / error: ‘C::b’ is not a class or namespace
{ A C::*ca = cb + ba; } // error: invalid operands of types ‘B C::*’ and ‘A B::*’ to binary ‘operator+’
A C::*ca = HOW(???); // is possible to reach C::b::a by a member pointer?
#endif
C cptr;
A aptr = cptr.*cb.*ba; // is pointer inference chaining the only solution?
return 0;
}
如果成员指针的推理链是到达内部成员的唯一解决方案,我可以使用模板将其封装在单一类型上吗?
现在代码可以用gcc编译了
谢谢大家
【问题讨论】:
-
这段代码看起来很奇怪,我无法编译它。究竟是什么意思 A B::*ba = &B::a;你确定这是正确的吗?我看到了这样的代码:A a;乙乙; b.a=a;和指针一样的东西,但从不使用“::”
-
@AdrianMaire:
A B::*ba = &B::a;声明ba是指向B类型为A的成员的指针,并使用&B::a对其进行初始化。它应该编译得很好。 -
@Charles Bailey:谢谢,我会了解更多。
-
上面的代码中没有
C::b::a这样的东西。::的左侧必须是命名空间或类型名称。C::b不是其中任何一个。
标签: c++ member-pointers