Boost logo

Boost Users :

Subject: Re: [Boost-users] function template argument deduction with std::tuple
From: Ireneusz Szcześniak (irek.szczesniak_at_[hidden])
Date: 2017-11-23 10:36:52


Gavin, thank you again for your time and expertise! Thanks for the
reference!

One way to verify I was defining overloads is to remove the template
function declaration. After removing the declaration, the code
compiles, without complaining that the declaration is missing, which
is necessary for specialization.

On 23.11.2017 06:11, Gavin Lambert via Boost-users wrote:
> On 23/11/2017 01:11, Ireneusz Szcześniak wrote:
>> However, it bugs me that I'm still not sure whether I've implemented
>> a function-template specialization or a template for function
>> overloading.  You claim that this is an overload:
>>
>>> template <typename Graph>
>>> auto
>>> get_cost(const Label1<Graph> &l)
>>> {
>>>   return std::get<0>(l);
>>> }
>>
>> Could you please elaborate on how to tell one from the other?  Had
>> it been a specialization, a compiler should accept the explicit
>> template argument:
>>
>>> template <typename Graph>
>>> auto
>>> get_cost<Label1<Graph>>(const Label1<Graph> &l)
>>> {
>>>   return std::get<0>(l);
>>> }
>>
>> but I get (with gcc version 7.2.0):
>>
>>> error: non-class, non-variable partial specialization
>>> ‘get_cost<Label1<Graph> >’ is not allowed
>>> get_cost<Label1<Graph>>(const Label1<Graph> &l)
>>
>> So it seems that I was defining overloads (these don't have template
>> arguments), not specializations as I thought.  The C++ Programming
>> Language, 4th edition, the bottom of page 737, says that you can
>> drop the explicit template argument in the definition of a template
>> specialization, if it can be deduced.  So I dropped the explicit
>> template argument, and still considered the definition the
>> specialization.
>>
>> I have a hard time understanding the above error message, thought.
>> I understand that "non-class" simply means that it's not a member
>> function, OK.  But what "non-variable partial specialization" could
>> possibly mean?  What is "non-variable" here, and why "partial
>> specialization" when I gave all (i.e., one) template argument.  I
>> consider it a complete specialization albeit dependent on a template
>> parameter Graph.
>
> I suggest reading http://www.gotw.ca/publications/mill17.htm.
>
> The short version is that function templates are a bit weird, and if
> you have anything other than template<> it's an overload, because they
> don't do partial specialization.
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> https://lists.boost.org/mailman/listinfo.cgi/boost-users


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net