[LC++]C++ Template Instantiation problems
Dr Mark H Phillips
mark at austrics.com.au
Mon Sep 2 13:11:12 UTC 2002
Hi Charles,
I compiled your code on my machine, using gcc version 2.95.4
and got error messages which are a bit different from what you
reported. I include them below. Hopefully they are helpful to
you.
Cheers,
Mark.
cr2.cc: In function `int main(int, const char *const *)':
cr2.cc:67: initialization of non-const reference type `void (A::* &)()'
cr2.cc:67: from rvalue of type `void (A::*)()'
cr2.cc:47: in passing argument 2 of `gx_callback::make_M2<A, void
(A::*)()>(A &,
void (A::* &)())'
cr2.cc: In function `static class gx_callback gx_callback::make_M2<A,
void (A::*)()>(A &, void (A::* &)())':
cr2.cc:67: instantiated from here
cr2.cc:49: cannot allocate an object of type `gx_memberCB<A,void
(A::*)()>'
cr2.cc:49: since the following virtual functions are abstract:
cr2.cc:7: void gx_callbackBaseBody::operator ()() const
On Sat, 2002-08-31 at 01:17, Charles Randle wrote:
> Hi All,
> This is a repost due to an email address change :
>
> I have the following code :
> #include <iostream>
>
> class gx_callbackBaseBody {
> public:
> gx_callbackBaseBody() {}
> virtual ~gx_callbackBaseBody() {}
> virtual void operator ()() const = 0;
> };
>
>
>
> class gx_callback {
> public:
>
> gx_callback(gx_callbackBaseBody *ptr) :
> entity(ptr) {}
> gx_callback(gx_callback const & arg) :
> entity(arg.entity) {}
> ~gx_callback() { delete entity;entity = 0;return;}
> void operator ()() { (*entity)();}
>
> template <class CLIENT,class CLIENTMEMBER>
> static gx_callback make_M2(CLIENT &,CLIENTMEMBER
> &);
>
> private:
> gx_callbackBaseBody *entity;
> };
>
>
>
> template <class CLIENT,class MEMBER>
> class gx_memberCB : public gx_callbackBaseBody {
> public:
> gx_memberCB(CLIENT &clnt,MEMBER &clntmem) :
> client(clnt),clientmember(clntmem) {}
> virtual void operator () () { ((&client)
> ->*member)();}
>
> private:
> CLIENT &client;
> MEMBER &clientmember;
> };
>
> template <class CLIENT,class CLIENTMEMBER>
> gx_callback gx_callback::make_M2(CLIENT
> &c,CLIENTMEMBER &cm) {
> return gx_callback(new
> gx_memberCB<CLIENT,CLIENTMEMBER>(c,cm));
> }
>
>
> class A {
> public:
> A(){}
> ~A(){}
> void noretsnoargs() {::std::cerr << "NO returns & No
> Args !!" << ::std::endl;return;}
> };
>
>
> int main (int argc,char const * const * const argv) {
>
> A objectA;
>
> gx_callback test1
> (gx_callback::make_M2(objectA,&A::noretsnoargs));
> //
> // Execute object
> test1();
> }
>
>
> Which gives the following error on compilation:
>
> g++ cbtest.cpp -o cbtest
> cbtest.cpp: In function `int main(int, const char*
> const*)':
> cbtest.cpp:62: no matching function for call to
> `gx_callback::make_M2(A&, void
> (A::*)())'
> cbtest.cpp:42: candidates are: static gx_callback
> gx_callback::make_M2(CLIENT&,
> CLIENTMEMBER&) [with CLIENT = A, CLIENTMEMBER =
> void (A::*)()]
> make: *** [cbtest] Error 1
>
>
> Can anyone explain this and possibly suggest a
> solution.
>
> Best Regards,
> Charles Randle
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Finance - Get real-time stock quotes
> http://finance.yahoo.com
>
> _______________________________________________
> This is the Linux C++ Programming List
> : http://lists.linux.org.au/listinfo/tuxcpprogramming List
--
Dr Mark H Phillips
Research Analyst (Mathematician)
AUSTRICS - smarter scheduling solutions - www.austrics.com
Level 2, 50 Pirie Street, Adelaide SA 5000, Australia
Phone +61 8 8226 9850
Fax +61 8 8231 4821
Email mark at austrics.com.au
More information about the tuxCPProgramming
mailing list