error : outer function context of `D main` is needed to `new` nested class `main.main.X`

Bert Bert at gmail.com
Thu Aug 15 01:55:17 UTC 2019


void main()
{
     class X { ... }
     auto f = foo!X;
}

then in another module I have a templated function foo that 
simply new's x:

auto foo(T)() { return new T; }

yet I get the error.

I realize that X is local to main and I realize I could do 
something like

foo(new X);

but that completely defeats the purpose(my context is more 
complicated). I need to construct X, not have the user do it.

I thought the templated function would be instantiated at the 
call site?

I've tried to "hack" it in various ways but nothing works. I've 
imported the model, but since X is local to main it can't be 
seen. I've tried to fully qualify it but it can't be found. 
main.main.X says something about void(the return type of main()): 
no property `` for type `void`.

template foo(T)
{
	alias foo = T;
         alias foo = () { return new T; }; // or
}

then I can do new foo!T, but I cannot actually construct T like I 
need to. I cannot seem to return a proper type either. I've tried 
returning a lambda and so on, but D is enforcing the type be 
accessible even if the function will be used in the correct 
context.

I don't understand stand why it is a problem when the template 
functions are suppose to be instantiated at the call site.

Seems like a complete pain just to be able to construct a type 
outside it's context(but the construction is totally within the 
context, or should be. I'm simply trying to provide a simple 
wrapper that does some boilerplate and makes everything look 
nice).



More information about the Digitalmars-d-learn mailing list