Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: C++
Expertise: Beginner
Oct 3, 2000

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

DevX Pro
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap