[vtkusers] Templated class members as callbacks for vtkCommand?
Mark Asbach
mark.asbach at post.rwth-aachen.de
Fri Apr 18 08:04:27 EDT 2003
Hi Parag,
> I’m trying to attach a templated member function as the callback for
> an event in VTK.
> I chose the second approach because the first won’t work for my
> purposes, so my code looks something like this:
Both approaches are identical, it's just that you can avoid name
clashes if you embed the callback into a class by making it a static
member.
> static void HistogramInteractorProcessPickEvent
> Then inside the class, I do the following:
>
> m_PickEventCommand->SetCallback(&HistogramInteractorProcessPickEvent);
> This works fine; however, what I’d really like to do is have the C
> function above be templated over the type of the itk Image, so
> something like:
> This generates an error during compilation under both MSVC6 and Linux
> gcc3.2, something akin to:
> :\development\aks\Code\Visualization\aksHistogramInteractor.cxx(68) :
> error C2664: 'SetCallback' : cannot convert parameter 1 from 'void
> (class vtkObject *,unsigned long,void *,void *)' to 'void (__cdecl
> *)(class vtkObject *,unsigned long,void *,void *)’
The compiler tells you what's the problem: C calling style is needed,
but you did provide something different (namely C++ standard calling
style). It's just your luck that the non-templated version works
(because your compilers assume it's C linkage, probably because it sits
in a different file ending in .c).
Just tell the compiler that your template uses C calling style by
surrounding declaration and definition with
extern "C"
{
template<whatever>
static void HistogramInteractorProcessPickEvent (class vtkObject
*,unsigned long,void *,void *);
}
See "The C++ Programming Language", second edition, "9.2.5 Linkage and
Pointers to Functions" if there're questions left (or ask again here).
Yours,
Mark
More information about the vtkusers
mailing list