devxlogo

Problem with Pointer-to-Member in Templates

Problem with Pointer-to-Member in Templates

Question:
I am trying to write a template that somewhat resembles how an inner class works in Java:

template class Callback{public:    Callback(T& t) : parent(t) { }    void Execute() { parent.*F(); }private:    T& parent;};

In Visual C++ 6, this complains that F is an invalid template argument, but when I remove the T and hardcode a class in as:

class Parent;template class Callback { /* ... */ };

… it works fine. Is this just a problem with VC6 or am I doing something wrong or ambiguous?

Answer:
First of all, you need to parenthesize the member function invocation inside Execute() as follows:

    void Execute() { (parent.*F)(); }

Secondly, some errors may result from the way you instantiate the template. To check whether it’s a bug, try the following example. It compiles and runs successfully under C++ Builder 4.0. If your compiler still fails to compile it, it probably has a bug:

struct A{ void f() {int j =0;}};template class Callback{public: Callback(T& t) : parent(t) { } void Execute() { (parent.*F)(); }private: T& parent;};int main(){ A a; Callback  c(a); c.Execute();}

devx-admin

Share the Post: