Strange Mixin issue

Frustrated Frustrated at nowhere.com
Wed Mar 5 15:39:57 PST 2014


On Wednesday, 5 March 2014 at 23:33:25 UTC, Frustrated wrote:
> Maybe the problem isn't what I thought it was. I created a test 
> case that works:
>
> import std.stdio, std.cstream;
>
> mixin template C()
> {
> 	alias A = typeof(this);
> 	mixin(B!(A));
> }
>
> template B(T)
> {
> 	pragma(msg, T);
> 	enum B() { return "string foo() { return `<"~T.stringof~">`; 
> }"; }
> }
>
> class A
> {
> 	//mixin(B!(A));
> 	mixin C;
> }
>
>
> void main()
> {
> 	auto a = new A;
> 	writeln(a.foo());
> 	//a.B();
> 	din.getc();
> }
>
>
> Note the difference in calls. C is much easier because you 
> don't have to pass the parent type. This is all I'm trying to 
> achieve in the other code but when I do the functions(foo in 
> this case) do not get mixed in.


The actual error is quite strange in the other code:

When I simply wrap the code in an outside template I get the 
error(s)

Eror: gui.border is not an lvalue	

which is related to the line

auto ress = (gui.border = bb);

which works when I don't wrap the code. If I stick the output of 
the string mixin template directly into the class, it works fine. 
(so it has something to do wtih the template generation rather 
than what it generates)

e.g., this is what I did

template AbstractToInterface(B, T...)
{	
	enum AbstractToInterface() { .... }
}

to

mixin template AbstractToInterface(B, T...)
{
	mixin(AbstractToInterface2!(B, T));
}

template AbstractToInterface2(B, T...)
{	
	enum AbstractToInterface2() { .... }
}

and convert

mixin(AbstractToInterface!(WindowsGui, iButton, WindowsButton, 
iBorder, WindowsBorder));

to

mixin AbstractToInterface!(WindowsGui, iButton, WindowsButton, 
iBorder, WindowsBorder);


and I get the error down the road about

Eror: gui.border is not an lvalue

Which I guess is saying border does not have a setter, which is 
what AbstractToInterface is suppose to be creating and adding... 
again, it works when I copy the output of the template direct to 
the class.

I'm betting it's a bug unless I'm doing something real stupid.



More information about the Digitalmars-d-learn mailing list