Rusu Boca, Ionut | 5 Mar 2012 05:21
Picon
Favicon

Cannot link C++ template ; pls help ...


Hello,

I am trying to use templates in my C++ application, but it looks like the definition of the template instance
fails to be found in case it is defined in a different module.

I read the IBM docs regarding templates and their suggestions to use either TEMPLATE(*TEMPINC) or
TMPLREG(*DFT ) but none works.

Here is the example , containing three objects :

H/IONUT                             : header declaring one normal class , Order, and one template class , Record<T>  ; please not
Record's public constructor is defined outside this object
QCSRC/IONUT                   : defines Record's public constructor
QCSRC/IONUTMAIN       : main ; instantiates an object or type Record<Order>

When compiling, both IONUT and IONUTMAIN *MODULEs compile successfully; when binding them into the IONUT
*PGM, however, the error comes like this :

Definition not found for symbol '__ct__Q2_5ionut6RecordXTQ2_5ionut5Order_Fv'

This suggests to me that the linker cannot find Record's constructor which is defined in QCSRC/IONUT ; if ,
however, I define it inline, in H/IONUT , it works fine.

Both *MODULEs and the program are creates as follows :

CRTCPPMOD MODULE($IRB1201/IONUTMAIN) SRCFILE($IRB1201/QCSRC) SRCMBR(IONUTMAIN) OUTPUT(*PRINT)
DBGVIEW(*SOURCE) TEMPLATE(*TEMPINC)
CRTCPPMOD MODULE($IRB1201/IONUT) SRCFILE($IRB1201/QCSRC) SRCMBR(IONUT) OUTPUT(*PRINT)
DBGVIEW(*SOURCE) TEMPLATE(*TEMPINC)
(Continue reading)

Bill Seurer | 6 Mar 2012 23:19
Picon
Favicon

Re: Cannot link C++ template ; pls help ...

c400-l-bounces <at> midrange.com wrote on 03/04/2012 10:21:13 PM:

> I am trying to use templates in my C++ application, but it looks
> like the definition of the template instance fails to be found in
> case it is defined in a different module.
>
> I read the IBM docs regarding templates and their suggestions to use
> either TEMPLATE(*TEMPINC) or TMPLREG(*DFT ) but none works.
>
> Here is the example , containing three objects :

For TEMPINC at least you may be missing something to force the template to
be instantiated.  This is discussed in the C/C++ Programmer’s Guide in the
section titled "Structuring a Program for TEMPINC-Managed Instantiations".

As an alternative you can use the pragmas IsHome and HasHome which are
documented in the Compiler Reference section on pragmas.  That is what I
usually use.

-Bill
--

-- 
This is the C programming iSeries / AS400 (C400-L) mailing list
To post a message email: C400-L <at> midrange.com
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/c400-l
or email: C400-L-request <at> midrange.com
Before posting, please take a moment to review the archives
at http://archive.midrange.com/c400-l.

(Continue reading)

Rusu Boca, Ionut | 12 Mar 2012 11:04
Picon
Favicon

Re: Cannot link C++ template ; pls help ...


Thank you very much for your suggestion.

Indeed, I have been missing to fully understand some of the core requirements in order to make use of TEMPINC successfully.

Implementation-wise, in my email example I had to add ..

template
class Record<Order>;

.. in my IONUT.H header file ; that forced, according to what I've understood, the creation of the
specialized template instance in TEMPINC , which was then properly found at binding time by the
compilation unit that was using it ( IONUTMAIN *MODULE ) .

As with #pragmas hashome/ishome, I will give it a try, shortly.

Thank you very much, again,
Ionut


-----Original Message-----
From: c400-l-bounces <at> midrange.com [mailto:c400-l-bounces <at> midrange.com] On Behalf Of Bill Seurer
Sent: Wednesday, March 07, 2012 6:20 AM
To: C programming iSeries / AS400
Subject: Re: [C400-L] Cannot link C++ template ; pls help ...

c400-l-bounces <at> midrange.com wrote on 03/04/2012 10:21:13 PM:

> I am trying to use templates in my C++ application, but it looks like 
> the definition of the template instance fails to be found in case it 
(Continue reading)


Gmane