help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Explicite Template Instantiation and Inline


From: tthunder
Subject: Re: Explicite Template Instantiation and Inline
Date: 19 May 2007 00:29:35 -0700
User-agent: G2/1.0

> > Some compilers really compile it.
>
> It compiles fine. It just doesn't link.

My fault, sorry. I mean, it links.


>
> > VC71, BCB 2006
> > It works.
>
> I have no clue what 'BCB 2006' is, but VC71 fails to link it just
> like most of the other compilers:

You are right, the code doesn't link with VC71 either.
I cannot answer offhand, why my more complicated library still is
compiling on VC71 ( I thought my small example matches the big case ).
I have to analyse this.

But BCB2006 DOES, I swear ;)

(Of course, I know, that G++ is the much more STANDARD complient
compiler. Therefore, I am using it...)

> > If g++ does not generate the code for "foo<bool>::notUsed()", how does
> > g++ know that "doFunc<bool>()" is needed.
>
> But g++ *is* generating the code (because you asked it to):

Yes, that's the problem. I didn't expect a compiler to generate the
code, because it's inline.
I thought it's generated when it is used in code only, not by an
explicit template instantiation.
I am exporting code to a library, therefore the explicit
instantiation! The inline code does not have to be explicitely
instantiated and exported.> > Instantiating "foo<bool>::notUsed()"
would instantiate

> > "doFunc<bool>()". Unfortunatelly, "doFunc<...>()" does not work for
> > "bool". Therefore, using "notUsed()" for type "foo<bool>" should be
> > prohibited.
>
> The way to prohibit its instantiation is to provide a specialization
> that does not compile (compile-time assert) or that aborts at
> runtime.

I know, how to do the runtime work, because I implemented it once.
However, I think that this isn't the right way. The error should be
thrown by compiler (or linker).

Let's call "doFunc<....>()" => "doModulo<...>()"  (<= not defined for
"bool", but for others, of course)

e.g. for "int"
template <>
int computeValueModulo(const int &, const int &)
{}

And "notUsed()" => "foo<T> &operator(const T&)"  (<= should not be
explicitely instantiated for foo<bool> therefore)

The only way to achieve this is to make an additional class, which is
fully specialized, right?
Can anybody think about another possibility?

> // template class foo<bool>;  // <<< BOGUS instantiation request

Yes, I need explicit instantiation (because of export).
The only thing I wanted in my example is: Do throw an compiler error
(maybe linker error), if "notUsed()" IS used for "bool".

Thank you for your help Paul!!



reply via email to

[Prev in Thread] Current Thread [Next in Thread]