Question:
I am trying to write a template that somewhat resembles how an inner class works in Java:
templateclass 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;templateclass 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();}