digitalmars.D - Behavior of signed/unsigned conversion in template parameters
- Peter Alexander (21/21) Jul 30 2010 Just had this error crop up. I just wanted to check whether this is
- Peter Alexander (2/23) Jul 31 2010 Oops. If it wasn't obvious, the c!(1)(f) is meant to be c!(1)(a).
Just had this error crop up. I just wanted to check whether this is correct behavior as I don't know the details of D's templates. I'm using DMD 2.047 to compile with no flags. struct A(uint N) { } void b(uint N)() { } void c(uint N)(A!(N) a) { } void main() { A!(1) a; // OK b!(1)(); // OK c!(1)(f); // Error - cannot implicitly convert A!(1) to A!(N) c(a); // Error - cannot implicitly convert A!(1) to A!(N) } Are those errors correct? If so, why can I instantiate 'A' and 'b' with a signed int parameter, but can't instantiate 'c'? It seems that the uint-ness of the template parameter is only enforced when there is an argument involved, but I don't understand the reasoning behind this (if any). I would expect either all of these to compile, or none to compile. Thanks in advance.
Jul 30 2010
On 30/07/10 8:52 PM, Peter Alexander wrote:Just had this error crop up. I just wanted to check whether this is correct behavior as I don't know the details of D's templates. I'm using DMD 2.047 to compile with no flags. struct A(uint N) { } void b(uint N)() { } void c(uint N)(A!(N) a) { } void main() { A!(1) a; // OK b!(1)(); // OK c!(1)(f); // Error - cannot implicitly convert A!(1) to A!(N) c(a); // Error - cannot implicitly convert A!(1) to A!(N) } Are those errors correct? If so, why can I instantiate 'A' and 'b' with a signed int parameter, but can't instantiate 'c'? It seems that the uint-ness of the template parameter is only enforced when there is an argument involved, but I don't understand the reasoning behind this (if any). I would expect either all of these to compile, or none to compile. Thanks in advance.Oops. If it wasn't obvious, the c!(1)(f) is meant to be c!(1)(a).
Jul 31 2010