Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
March 04, 2007 template specialization | ||||
---|---|---|---|---|
| ||||
Hi, when I compile this : template toString(T) { char[] toString(T x){ return "<??>"; } } template toString(T : T[]) { char[] toString(T[] x){ return "<array>"; } } , I get this : tools.d(162): template tools.toString(T : T[]) specialization not allowed for deduced parameter T According to the online manual this should be no error. How can I solve this ? |
March 04, 2007 Re: template specialization | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thorsten | "Thorsten" <thorstenkiefer@gmx.de> wrote in message news:esd2dn$126l$1@digitalmars.com... > , I get this : > tools.d(162): template tools.toString(T : T[]) specialization not allowed > for deduced parameter T > > According to the online manual this should be no error. > How can I solve this ? You are instantiating this template implicitly, as: char[] s = toString([1, 2, 3]); The spec says "Function template type parameters that are to be implicitly deduced may not have specializations." |
March 04, 2007 Re: template specialization | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thorsten | OK, I solved it that way : char[] toString(T)(T x){ static if(is(T B == B[])) { char[] s; s ~= '['; if(x.length > 0){ s ~= toString(x[0]); foreach(y;x[1..$]){ s ~= ','; s ~= toString(y); } } s ~= ']'; return s; } else { return std.string.toString(x); } } |
March 04, 2007 Re: template specialization | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley Wrote:
> The spec says "Function template type parameters that are to be implicitly deduced may not have specializations."
And why is that ? The type parameters could be deduced and then the best specialization could be used. Why do they exclude each other ?
|
March 04, 2007 Re: template specialization | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thorsten Kiefer | Thorsten Kiefer wrote:
> OK, I solved it that way :
>
> char[] toString(T)(T x){
> static if(is(T B == B[])) {
> char[] s;
> s ~= '[';
> if(x.length > 0){
> s ~= toString(x[0]);
> foreach(y;x[1..$]){
> s ~= ',';
> s ~= toString(y);
> }
> }
> s ~= ']';
> return s;
> } else {
> return std.string.toString(x);
> }
> }
>
You could also get this same effect just by calling std.string.format(), which as I recall formats arrays in precisely this way.
format("%s", [1, 2, 3]) => "[1, 2, 3]"
(Admittedly its been a little while since I used Phobos, though.)
-- Chris Nicholson-Sauls
|
March 05, 2007 Re: template specialization | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley wrote:
> "Thorsten" <thorstenkiefer@gmx.de> wrote in message news:esd2dn$126l$1@digitalmars.com...
>> , I get this :
>> tools.d(162): template tools.toString(T : T[]) specialization not allowed for deduced parameter T
>>
>> According to the online manual this should be no error.
>> How can I solve this ?
>
> You are instantiating this template implicitly, as:
>
> char[] s = toString([1, 2, 3]);
>
> The spec says "Function template type parameters that are to be implicitly deduced may not have specializations."
Really? I'm almost sure I've done this before too. How weird.
Sean
|
Copyright © 1999-2021 by the D Language Foundation