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();}

Share the Post:
data observability

Data Observability Explained

Data is the lifeblood of any successful business, as it is the driving force behind critical decision-making, insight generation, and strategic development. However, due to its intricate nature, ensuring the

Heading photo, Metadata.

What is Metadata?

What is metadata? Well, It’s an odd concept to wrap your head around. Metadata is essentially the secondary layer of data that tracks details about the “regular” data. The regular

XDR solutions

The Benefits of Using XDR Solutions

Cybercriminals constantly adapt their strategies, developing newer, more powerful, and intelligent ways to attack your network. Since security professionals must innovate as well, more conventional endpoint detection solutions have evolved