May 10, 2005 Fct ptr to exported member fct | ||||
---|---|---|---|---|
| ||||
DMC Compiler version 8.42n Win2K IDDE -WD I have a class that I am exporting during compilation for building a dll. I am getting the "cannot find constructor" error during compilation, in AbstractContainer::init(). Here is the error exracted from source listing file: void AbstractContainer::init() { controlHandler_ = new ControlEvHandler<AbstractContainer>( this, &AbstractContainer::containerResized); ^ AbstractContainer.cpp(26) : Error: cannot find constructor for class matching ControlEvHandler<AbstractContainer >::ControlEvHandler<AbstractContainer >(AbstractContainer*,void ( AbstractContainer::*__export member func)(ControlEvent*)) &AbstractContainer::containerResized); } I believe the problem is with "AbstractContainer::*__export member func" in output error above, which is expecting a pointer to an exported member function. If I do not export the member function, the error disappears. Here is some of the code that hopefully can illustrate the problem. //================ from EventHandler.h ============================ class __declspec(dllimport) EventHandler { //yes, importing this one public: EventHandler(){} ~EventHandler(){} // code removed }; // Note the fct. pointer typedef below. This will be the fct. pointer to AbstractContainer::containerResized template <class SOURCE, class EVENT> class EvHandInst : public EventHandler { public: typedef void(SOURCE::*OnEvHandMethod)( EVENT* e ); EvHandInst( SOURCE* source, OnEvHandMethod handlerMethod) { source_ = source; handlerMethod_ = handlerMethod; } virtual ~EvHandInst(){ } protected: SOURCE* source_; OnEvHandMethod handlerMethod_; }; //============= from AbstractContainer.h =================== class __declspec(dllexport) ControlEvent { public: ControlEvent( ); ~ControlEvent(); //code removed }; template <class SOURCE_TYPE> class ControlEvHandler : public EvHandInst<SOURCE_TYPE, ControlEvent> { public: ControlEvHandler( SOURCE_TYPE* source, EvHandInst<SOURCE_TYPE, ControlEvent>::OnEvHandMethod handlerMethod) : EvHandInst<SOURCE_TYPE, ControlEvent>( source, handlerMethod) { } }; class __declspec(dllexport) AbstractContainer : public Container { public: AbstractContainer(); virtual ~AbstractContainer(); void init(); protected: EventHandler* controlHandler_; void containerResized( ControlEvent* event ); private: int dumb_; }; member init() creates an ControlEvHandler (has base class EventHandler), and note I am passing the address of (exported) member AbstractContainer::containerResized. The error occurs in this fct., because it can't find a constructor taking an exported member fct. address? void AbstractContainer::init() { controlHandler_ = new ControlEvHandler<AbstractContainer>( this, &AbstractContainer::containerResized); } I am thinking the problem is the syntax of the typedef of fct. pointer in class EvHandInst: typedef void(SOURCE::*OnEvHandMethod)( EVENT* e ); but I am not sure of this. Is there a special way to note a fct. pointer is to an exported member fct? Or, am I doing something else wrong here? I ask here, because I don't get this error with some other compilers, and am thinking I just need slightly different (correct) syntax for DMC compiler. Thanks for any help. |
May 27, 2005 Re: Fct ptr to exported member fct | ||||
---|---|---|---|---|
| ||||
Posted in reply to dt | "dt" <tinkham@ucalgary.ca> wrote in message news:d5pfrr$dov$1@digitaldaemon.com... > > I am thinking the problem is the syntax of the typedef of fct. pointer in class EvHandInst: > > typedef void(SOURCE::*OnEvHandMethod)( EVENT* e ); > > > but I am not sure of this. > > Is there a special way to note a fct. pointer is to an exported member fct? Or, am I doing something else wrong here? I ask here, because I don't get this error with some other compilers, and am thinking I just need slightly different (correct) syntax for DMC compiler. > > Thanks for any help. > Well, I guess DMC wants exactly what it is asking for. If I change typedef void(SOURCE::*OnEvHandMethod)( EVENT* e ); to typedef void(SOURCE::*__export OnEvHandMethod)( EVENT* e ); Then this particular error message is removed. However, we have classes (with member funcs) that are not exported, and when they use the above code with __export added, we get the corresponding error message for the case where the 'constructor' without __export cannot be found. It seems odd that all the VC, borland, CW, and MinGW gcc3.3.1 can handle all this transparently. Is this a compiler bug, or no? Doug |
Copyright © 1999-2021 by the D Language Foundation