On Wed, Aug 8, 2012 at 3:37 PM, Diego Novillo <dnovi...@google.com> wrote:
> On 12-08-08 16:12 , Gabriel Dos Reis wrote:
>>
>> hi Diego,
>>
>> just a word on style in the documentation:
>>
>>> +template<typename T>
>>> +void gt_pch_nx (TP<T> *tp)
>>> +@{
>>> +  extern void gt_pch_nx (T&);
>>> +
>>> +  /* This marks field 'fld' of type 'T'.  */
>>> +  gt_pch_nx (tp->fld);
>>> +@}
>>
>>
>> 'extern'  declaration at local scope if considered an extremely
>> poor style in C++.  Furthermore, it does not interact
>> well with template instantiations and scope rules; plus
>> it does not work well when the function actually has an
>> internal linkage.
>>
>> A proper way to bring a symbol into local scope is through
>> a using-declaration:
>>
>>       using ::gt_pch_nx;
>
>
> I struggled a bit with this. I need to tell the template function that there
> exists a free function gt_pch_nx that takes a T&. This is not something that
> any header file has at the point of this declaration.
>
> The function gt_pch_nx(T&) is declared and defined later in one of the
> gt-*.h files.  This is another problem with the way that gengtype works
> today.
>
> The using-declaration that you propose does not seem to give me what I want,
> though. How does it know that the function takes a T&?

So, if the issue that the function does not exist at the point of the template
definition, but will definitely exist at the point where it is instantiated
because of inclusion of a header file (later or in a different
translation unit),
then the usual way is to write no declaration at all.  The compiler will perform
a lookup at the point of instantiation and resolve the name
appropriate, or error.

you can just write:

void gt_pch_nx (TP<T> *tp)
{
     /* This marks field 'fld' of type 'T'.  */
     gt_pch_nx (tp->fld);

}

Am I understanding you correctly?

-- Gaby

Reply via email to