Thread: [Doxygen-users] warning at explicit instantiation of overloaded template class member function
Brought to you by:
dimitri
|
From: Heese, H. <har...@ph...> - 2015-08-26 13:35:24
|
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)?
Thanks,
Harald Heese
________________________________
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.
|
|
From: Dimitri v. H. <do...@gm...> - 2015-08-26 14:04:00
|
Hi Harald,
> On 26 Aug 2015, at 15:19 , Heese, Harald <har...@ph...> 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
|
|
From: Heese, H. <har...@ph...> - 2015-08-26 14:32:28
|
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:do...@gm...]
Sent: Wednesday, August 26, 2015 4:04 PM
To: Heese, Harald
Cc: dox...@li...
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 <har...@ph...> 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.
|
|
From: Dimitri v. H. <do...@gm...> - 2015-08-26 15:45:22
|
Hi Harald,
> On 26 Aug 2015, at 16:32 , Heese, Harald <har...@ph...> wrote:
>
> 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).
I see. A solution/workaround is to use \relates, i.e.:
//! \relates Bar
//! \brief force instantiation of first overload for type 'short'
template short Bar::foo<short>(short, int);
Regards,
Dimitri
|