Thread overview
Is this is bug or not?
Mar 11, 2006
Victor Nakoryakov
Mar 15, 2006
Thomas Kuehne
Mar 17, 2006
Don Clugston
Mar 17, 2006
Sean Kelly
March 11, 2006
Hi all,

Here is a snipet:

import std.stdio;

struct A(T, T x0)
{
T x = x0;
}

int main(char[][] args)
{
alias A!(int, 8) Ai; // test.d(11)
Ai ai;
writefln(ai.x);
return 0;
}

DMD output is:
test.d(11): template instance A!(int,8) does not match any template declaration

However snipet:

import std.stdio;

struct A(T, int x0) // note int instead of T
{
T x = x0;
}

int main(char[][] args)
{
alias A!(int, 8) Ai;
Ai ai;
writefln(ai.x);
return 0;
}

works as expected. Is former is a templates issue or bug?

--
Victor Nakoryakov (aka nail)
nail-mail[at]mail.ru

Krasnoznamensk, Moscow, Russia
March 15, 2006
Victor Nakoryakov schrieb am 2006-03-11:
> Hi all,
>
> Here is a snipet:
>
> import std.stdio;
>
> struct A(T, T x0)
> {
> T x = x0;
> }
>
> int main(char[][] args)
> {
> alias A!(int, 8) Ai; // test.d(11)
> Ai ai;
> writefln(ai.x);
> return 0;
> }
>
> DMD output is:
> test.d(11): template instance A!(int,8) does not match any template declaration
>
> However snipet:
>
> import std.stdio;
>
> struct A(T, int x0) // note int instead of T
> {
> T x = x0;
> }
>
> int main(char[][] args)
> {
> alias A!(int, 8) Ai;
> Ai ai;
> writefln(ai.x);
> return 0;
> }
>
> works as expected. Is former is a templates issue or bug?

Added to DStress as http://dstress.kuehne.cn/run/t/template_31_A.d http://dstress.kuehne.cn/run/t/template_31_B.d http://dstress.kuehne.cn/run/t/template_31_C.d http://dstress.kuehne.cn/run/t/template_31_D.d

template_31_C seems funny, but I'm not aware of any statement against it.

Thomas


March 17, 2006
Thomas Kuehne wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Victor Nakoryakov schrieb am 2006-03-11:
>> Hi all,
>>
>> Here is a snipet:
>>
>> import std.stdio;
>>
>> struct A(T, T x0)
>> {
>> T x = x0;
>> }
>>
>> int main(char[][] args)
>> {
>> alias A!(int, 8) Ai; // test.d(11)
>> Ai ai;
>> writefln(ai.x);
>> return 0;
>> }

If that had worked, it would have been a new feature. You're obtaining a type AND a value! Note that value parameters only work for basic types and char[]. It would be very cool, though -- it would enable a lot of code reuse for metaprogramming.

For example, pow!(real z, int n) and pow!(creal z, int n) would be able to share a common implementation. The fact that they can't has been bugging me for some time.
March 17, 2006
Don Clugston wrote:
> Thomas Kuehne wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Victor Nakoryakov schrieb am 2006-03-11:
>>> Hi all,
>>>
>>> Here is a snipet:
>>>
>>> import std.stdio;
>>>
>>> struct A(T, T x0)
>>> {
>>> T x = x0;
>>> }
>>>
>>> int main(char[][] args)
>>> {
>>> alias A!(int, 8) Ai; // test.d(11)
>>> Ai ai;
>>> writefln(ai.x);
>>> return 0;
>>> }
> 
> If that had worked, it would have been a new feature. You're obtaining a type AND a value! Note that value parameters only work for basic types and char[]. It would be very cool, though -- it would enable a lot of code reuse for metaprogramming.
> 
> For example, pow!(real z, int n) and pow!(creal z, int n) would be able to share a common implementation. The fact that they can't has been bugging me for some time.

For what it's worth, this is legal in C++:

    #include <iostream>

    template<class T, T x>
    struct S
    {
        static const T val = x;
    };

    int main()
    {
        int x = S<int,5>::val;
        std::cout << x << '\n';
    }

Sean