Hi Dimitri!
Thanks for the quick answer.
You are right, the provided code does not compile. The modified example now is
//! a test class with overloaded template members
class Bar
{
public:
//! first overload of template member function
template <typename T>
T foo(T a, int b)
{ return a; }
//! second overload of template member function
template <typename T>
T foo(T a, double c)
{ return a; }
};
//! force instantiation of first overload for type 'short'
template short Bar::foo<short>(short, int);
If you compile this using
gcc -c bar.cpp
the corresponding object file will contain exactly one symbol (which you can
see using nm). This is exactly what is intended (to force the creation of a
symbol for a specific template parameter).
The syntax you suggested refers to a different concept, namely "template
specialization". In that case, the statement
template<> short Bar::foo<short>(short, int);
is a function declaration, which would require a separate function definition
in order to create a corresponding symbol. If I would compile the modified
example with your suggestion, then the corresponding object file does not
contain any symbols (which is not what is intended).
Best regards,
Harald
-----Original Message-----
From: Dimitri van Heesch [mailto:[email protected]]
Sent: Wednesday, August 26, 2015 4:04 PM
To: Heese, Harald
Cc: [email protected]
Subject: Re: [Doxygen-users] warning at explicit instantiation of overloaded
template class member function
Hi Harald,
> On 26 Aug 2015, at 15:19 , Heese, Harald <[email protected]> wrote:
>
> Hi doxygen,
>
> I am encountering warnings using Doxygen 1.8.10 for the below example of
> overloaded template member functions with explicit instantiation of one (or
> more) of the overloads for specific template types.
>
> //! a test class with overloaded template members class Bar {
> public:
> //! first overload of template member function template <typename T>
> T foo(T a, int b);
>
> //! second overload of template member function template <typename
> T> T foo(T a, double c); };
>
> //! force instantiation of first overload for type 'short'
> template short Bar::foo<short>(short, int);
>
> Output
>
> warning: no matching class member found for template short Bar::foo<
> short >(short, int) Possible candidates:
> 'template < T >
> T Bar::foo(T a, int b)
> 'template < T >
> T Bar::foo(T a, double c)
>
> Is there a way to incorporate the existence of an explicit instantiation (or
> its accompanying doxygen documentation) in the detailed documentation of the
> class member (which happens if there are no overloads)?
If you use
//! force instantiation of first overload for type 'short'
template<> short Bar::foo<short>(short, int);
it should work. Note the <> after template. My compiler doesn't even compile
the code without it.
Groeten,
Dimitri
________________________________
The information contained in this message may be confidential and legally
protected under applicable law. The message is intended solely for the
addressee(s). If you are not the intended recipient, you are hereby notified
that any use, forwarding, dissemination, or reproduction of this message is
strictly prohibited and may be unlawful. If you are not the intended recipient,
please contact the sender by return e-mail and destroy all copies of the
original message.
------------------------------------------------------------------------------
_______________________________________________
Doxygen-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/doxygen-users