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 T, void (T::*F)() >class Callback{public: Callback(T& t) : parent(t) { } void Execute() { (parent.*F)(); }private: T& parent;};int main(){ A a; Callback < A, &A::f > c(a); c.Execute();}

See also  5 Tips for Working With an Onsite Interpreter
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist