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