Thread overview
function-local template specialization error
Jul 14, 2010
canalpay
Jul 14, 2010
bearophile
Jul 14, 2010
canalpay
Jul 14, 2010
bearophile
Jul 14, 2010
Don
July 14, 2010
void main()
{
    T input(T)()
    {}

    T input(T : string)()
    {}
}

Error message :

isimsiz.d(6): found 'input' when expecting ';' following statement
isimsiz.d(6): found ':' when expecting ')'
isimsiz.d(6): found 'string' when expecting ';' following statement
isimsiz.d(6): found ')' instead of statement
isimsiz.d(8): unrecognized declaration

Shouldn't that work?

And

void main()
{
    void input(T)()
    {}

    void input(T : string)()
    {}
}

Again, Shouldn't that work?

Error message:
isimsiz.d(6): Error: declaration input(T : string) is already defined

there is no problem when the templates are in the global namespace.
July 14, 2010
canalpay:
> void main()
> {
>     T input(T)()
>     {}
> 
>     T input(T : string)()
>     {}
> }

In D2 you can't define templates inside functions.

Bye,
bearophile
July 14, 2010
bearophile Wrote:
> In D2 you can't define templates inside functions.
> 
> Bye,
> bearophile

Thanks, But this example works:
void main()
{
    T input(T)()
    {}

}

 Why ?
July 14, 2010
canalpay:
> Thanks, But this example works:
> void main()
> {
>     T input(T)()
>     {}
> 
> }
> 
>  Why ?

You are right. Beside allowing nested functions (this is well known), it seems D2 also accepts the definition (with template constraint too) and instantiation of simple templates inside functions, I didn't know this.

But currently nested functions can't be overloaded. Probably for similar reasons inside a function you can't define more than one template with the same name. I presume this limit can be removed, so if you really need this you can ask for an enhancement request and if you can add a patch too to increase a bit the probability to see it fulfilled someday.

Bye,
bearophile
July 14, 2010
bearophile wrote:
> canalpay:
>> Thanks, But this example works:
>> void main()
>> {
>>     T input(T)()
>>     {}
>>
>> }
>>
>>  Why ?
> 
> You are right. Beside allowing nested functions (this is well known), it seems D2 also accepts the definition (with template constraint too) and instantiation of simple templates inside functions, I didn't know this.
> 
> But currently nested functions can't be overloaded. Probably for similar reasons inside a function you can't define more than one template with the same name. I presume this limit can be removed, so if you really need this you can ask for an enhancement request and if you can add a patch too to increase a bit the probability to see it fulfilled someday.
> 
> Bye,
> bearophile

The spec explicitly says:
"Unlike module level declarations, declarations within function scope are processed in order. This means that two nested functions cannot mutually call each other:

[snip]

Future directions: This restriction may be removed."

My guess is that it will become possible eventually.