digitalmars.D - Template parameter shadowing
- klickverbot (19/19) Sep 22 2010 In short, should the following be allowed?
- F. Almeida (6/25) Sep 22 2010 since T
- Simen kjaeraas (7/26) Sep 22 2010 I believe this is acceptable in the current spec, and as such would be
In short, should the following be allowed? --- class Class(T) { string foo(T)(T arg) { return T.stringof; } string bar() { return T.stringof; } } unittest { auto c = new Class!int; assert(c.foo("asdf") == "string"); assert(c.bar() == "int"); } --- Note that the T type parameter to the template function shadows the one from the template class, which might be a source of confusion since T refers to class template parameter in other member functions.
Sep 22 2010
== Quote from klickverbot (see klickverbot.at)'s articleIn short, should the following be allowed? --- class Class(T) { string foo(T)(T arg) { return T.stringof; } string bar() { return T.stringof; } } unittest { auto c = new Class!int; assert(c.foo("asdf") == "string"); assert(c.bar() == "int"); } --- Note that the T type parameter to the template function shadowsthe onefrom the template class, which might be a source of confusionsince Trefers to class template parameter in other member functions.It should not be allowed. The compiler should forbid using the same symbol for distinct template parameters. I'm surprised if this even compiles.
Sep 22 2010
klickverbot <see klickverbot.at> wrote:In short, should the following be allowed? --- class Class(T) { string foo(T)(T arg) { return T.stringof; } string bar() { return T.stringof; } } unittest { auto c = new Class!int; assert(c.foo("asdf") == "string"); assert(c.bar() == "int"); } --- Note that the T type parameter to the template function shadows the one from the template class, which might be a source of confusion since T refers to class template parameter in other member functions.I believe this is acceptable in the current spec, and as such would be an enhancement request (local symbols are allowed to shadow global). That said, I believe it is worthy of inclusion, as one much more rarely wants to shadow template parameters. -- Simen
Sep 22 2010