2015-11-07 2 views
2
template IsSame(T){ 
    template As(alias t){ 
    enum As = is(T : typeof(t)); 
    } 
} 
void main() 
{ 
    int i; 
    enum b = IsSame!int.As!(i); 
} 

Err:Невозможно использовать локальный «я» в качестве параметра неглобальную шаблона

Error: template instance As!(i) cannot use local 'i' as parameter to non-global template As(alias t) dmd failed with exit code 1

Я не понимаю, сообщение об ошибке.

Я также попытался

template IsSame(T){ 
    enum As(alias t) = is(T : typeof(t)); 
} 

Какие результаты в

Error: template app.IsSame!int.As cannot deduce function from argument types !()(int), candidates are: source/app.d(50,8):
app.IsSame!int.As(alias t)

Что я делаю неправильно?

+0

есть ли причина, вы используете '' enum' для b' вместо 'bool'? –

+0

Мне нужно это во время компиляции, не уверенный, хватит ли для этого bool. –

ответ

1

В ДМД 2.069.0 и DMD 2,065, он отлично работает, когда i глобальна:

import std.stdio; 

template IsSame(T){ 
    template As(alias t){ 
    enum As = is(T : typeof(t)); 
    } 
} 

int i; 

void main() 
{ 
    bool b = IsSame!int.As!(i); 
    writeln(b); // true 
} 

В documentation for template alias parameters претензии они позволяют шаблон параметрируемого с местными названиями, тоже, но не в состоянии обеспечить пример о том, как сделать это:

Alias parameters enable templates to be parameterized with any type of D symbol, including global names, local names, module names, template names, and template instance names. Literals can also be used as arguments to alias parameters.

(курсив мой)

+0

Он работает, если я пометил шаблон как статический, как 'staitc template IsSame (T) {' –

+0

Для полноты вам может потребоваться опубликовать рабочий код в качестве собственного ответа. –