我来自C背景,是CPP的新手。我有一种情况,我需要在一个将修改对象的对象上调用一个方法。但是从方法返回时,我需要将对象恢复到以前的状态。为了实现这一点,我使用了“Bjarne Stroustrup”所示的后缀,前缀包装技术。
除了这种技术,我还尝试使用函数模板和函数指针来概括将在修改对象上调用的方法。
template < class T >
class Call_proxy {
T* obj;
int ID;
public:
Call_proxy( T* pp ) : obj( pp ), ID( i ) {
}
~Call_proxy() {
obj->setID( ID );
}
T* operator ->() {
return obj;
}
};
template < class T >
class Proxy {
T* obj;
int ID;
public:
Proxy(T* pp) : obj(pp), ID(pp->getID()) { }
Call_proxy<T> operator ->() {
return Call_proxy<T>( obj, ID );
}
};
class X
{
int id;
public:
int getID();
void setID(int ID) { id = ID; }
void somefunction(int, int);
};
template<class X>
void doSomething(int nu, void(X::*fcn)(int, int))
{
Proxy<X> P(x);
P->setID(nu);
(P->*fcn)(nu, 1); //This call generates error on VS2010: Error 1 error C2296: '->*' : illegal, left operand has type 'Proxy<T>'
}
int main()
{
X x;
doSomething<X>(1, &X::somefunction);
}
你能帮我理解VS2010继续抱怨(P->*fcn)(nu, 1);
构建吗?
答案 0 :(得分:1)
void(X :: * fcn)(int,int)
这是指向X
类的成员函数的指针。
(P-> * fcn)(nu,1)
这是尝试使用P
来执行成员函数,但 P
的类型为Proxy<X>
(即,它不属于类型X
而且它不是指针。