This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Template instantiation & inheritance - fixed, but can I scrap the warning I get to do it?


Hi John -

I'm not 100% clear in regard to how this should behave according to
the standard (or even if the standard has anything to do with this gcc
flag), I believe that since you are forcing explicit instantiation,
you will probably have to instantiate ALL used templates, even if they
are templates used by an instantiated template.   Maybe someone in the
know could confirm?

Perhaps you aren't using the same flag in the compilation of your
program, and the code can see the template directly?  Then you would
have the explicitly instantiated subclass, and because you aren't
telling the compiler to explicitly instantiate while compiling the
executable, it takes care of implicitly instantiating anything used by
the subclass?  This is just a guess.  Do you use that flag for
compilation of all units?

  Brian

On Sat, Feb 27, 2010 at 10:37 AM, John Graham
<johngavingraham@googlemail.com> wrote:
>> Can you post a minimal example?
>
> An example of which bit? The only one I've made up so far is attached.
> It shows a basic configuration that compiles when the template
> instantiations are in a header file that's included in several
> translation units - set CFLAGS to define SUPER and/or SUB to include a
> particular template instantiation.
>
> However, the example attached doesn't *quite* show what I had in
> practice - the only difference is that when I instantiate the
> templates in a header file in my real library, I don't have to do
> anything for the superclass - that all just seems to get generated.
> However, in the example attached, you don't get the superclass's
> template information unless you instantiate it separately.
>
> John G
>
>
> On Sat, Feb 27, 2010 at 4:24 PM, Brian Budge <brian.budge@gmail.com> wrote:
>> Hi John -
>>
>> I was surprised to see that compile :).? You should be placing explicit
>> instantiations in a source file.? I'm not sure why it didn't work before.
>> Can you post a minimal example?
>>
>> On Feb 27, 2010 5:19 AM, "John Graham" <johngavingraham@googlemail.com>
>> wrote:
>>
>> Okay, I seem to have gone and answered my own question!
>>
>> For some reason I couldn't do:
>>
>>
>> template class ost::TRTPSessionBase<ost::RTPBaseUDPIPv4Socket,
>> ost::RTPBaseUDPIPv4Socket, ost::AVPQueue>;
>>
>>
>> Because I'd get a few of the following back:
>>
>>
>> ccrtp/rtp.h: In member function 'ost::IPV4Host
>> ost::TRTPSessionBase<RTPDataChannel, RTCPChannel,
>> ServiceQueue>::getDataSender(ost::tpport_t*) const [with
>> RTPDataChannel = ost::RTPBaseUDPIPv4Socket, RTCPChannel =
>> ost::RTPBaseUDPIPv4Socket, ServiceQueue = ost::AVPQueue]':
>> rtpaudioport.cpp:24: ? instantiated from here
>> ccrtp/rtp.h:205: error: no matching function for call to
>> 'ost::RTPBaseUDPIPv4Socket::getSender(ost::tpport_t*&)'
>> ccrtp/channel.h:114: note: candidates are: ost::IPV4Host
>> ost::RTPBaseUDPIPv4Socket::getSender(ost::tpport_t&) const
>>
>>
>> But I can do:
>>
>>
>> inline template class ost::TRTPSessionBase<ost::RTPBaseUDPIPv4Socket,
>> ost::RTPBaseUDPIPv4Socket, ost::AVPQueue>;
>>
>>
>> And that seems to generate the necessary class information.
>>
>> Still seems like a bit of a mystery that this has to be specifically
>> generated though... is there a reason for that?
>>
>> Also, I have to turn off -pedantic-errors to compile that, as it's a
>> non-standard extension. Is there any way I can specify an
>> -fno-<something> option to turn this error off:
>>
>> error: ISO C++ forbids the use of 'inline' on explicit instantiations
>>
>>
>> Thanks again,
>>
>> John G
>>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]