mixin template as virtual function with variadic params not working

Jarrett Billingsley kb3ctd2 at yahoo.com
Wed Jul 23 11:27:14 PDT 2008


"Derek Ney" <derek at hipgraphics.com> wrote in message 
news:g67eru$276j$1 at digitalmars.com...
>I am trying to create a set of methods that take a variable number of 
>arguments (at compile time). I would have liked to have used template 
>functions to do that, but I need the functions to be virtual, and template 
>functions cannot be virtual. So I thought I would try to use a mixin of a 
>variadic template function. But I am getting a weird compiler error with my 
>simple test program. Here is the test program:
>
>     1  import std.stdio;
>     2
>     3  template TCALL(ARGS...)
>     4  {
>     5    void makecall(ARGS args)
>     6    {
>     7      writefln("tcall...", args);
>     8    }
>     9  }
>    10
>    11  mixin TCALL!();
>    12  mixin TCALL!(int);
>    13  mixin TCALL!(int,int);
>    14
>    15
>    16  class Method
>    17  {
>    18    mixin TCALL!();
>    19    mixin TCALL!(int);
>    20    mixin TCALL!(int,int);
>    21  }
>    22
>    23  void main()
>    24  {
>    25    auto m = new Method;
>    26
>    27    m.makecall(0,1);
>    28    makecall(0,1);
>    29  }
>
> And when I compile with "Digital Mars D Compiler v2.014" I get this error:
>
> test6.d(27): Error: m.makecall is not a declaration
> test6.d(27): Error: function expected before (), not 1 of type int
>
> Can anyone explain what is going on here? It seems like it should work. 
> Note that if you comment out line 27 and compile it compiles fine and runs 
> producing the expected output:
>
> tcall...01
>
> -Thanks, Derek

My guess is that it's a bug.  If you only mix in one version (say, the (int, 
int) version), it works, and it's virtual.  And the global versions work 
fine.  I'd expect the methods to work fine as well. 





More information about the Digitalmars-d mailing list