digitalmars.D - Instantiating template classes with default template arguments
- Sean Kelly (42/42) Feb 14 2007 Currently, this is illegal:
- Bruno Medeiros (5/16) Feb 15 2007 What's wrong with that?
- Sean Kelly (11/25) Feb 15 2007 Oops... you're right. I edited that from my original example:
- Bruno Medeiros (15/47) Feb 16 2007 The template that matches is the char one, the second one. It matches
- janderson (3/16) Feb 15 2007 It looks like the compiler doesn't evaluate the template until its used....
Currently, this is illegal: class C( T = int ) {} void main() { C val = new C; } However, I'm not sure I've ever completely understood the reason for it. The intent seems clear: use class type C with the default template arguments. From a 1000' perspective, this seems no different than the following legal case (please note that the leading default is useless): class C( T = int, T = int ) {} void main() { C!(int) val = new C!(int); } Resolving specializations isn't an issue either, since resolving with with one supplied argument is the same as resolving with no supplied arguments. I don't suppose there is any chance of this changing? And if not, can someone please explain why? For what it's worth, I realize that the following works: class C( T = int ) {} void main() { C!() val = new C!(); } but the "!()" just amounts to semantic noise IMO. Is it truly necessary, given that the symbol "C" must be unique anyway? As a use case, it would allow this: class String( T = char ) {} alias String!(wchar) WString; instead of this: class StringImpl!( T ) {} alias StringImpl!(char) String; alias StringImpl!(wchar) WString; which currently makes extending library classes somewhat confusing to new users (reference the std::basic_string issue in C++). Sean P.S. In writing this, I discovered that the following code compiles when it should not: class C( T = int, U = int ) {} class C( T = int, U : char = int ) {} void main() { auto c = new C!(int); }
Feb 14 2007
Sean Kelly wrote:P.S. In writing this, I discovered that the following code compiles when it should not: class C( T = int, U = int ) {} class C( T = int, U : char = int ) {} void main() { auto c = new C!(int); }What's wrong with that? -- Bruno Medeiros - MSc in CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D
Feb 15 2007
Bruno Medeiros wrote:Sean Kelly wrote:Oops... you're right. I edited that from my original example: class C( T = int, U = int ) {} class C( T = int, U : char = char ) {} void main() { auto c = new C!(int); } This one shouldn't compile and does. Unless the defaults are always chosen from the lexically first match? SeanP.S. In writing this, I discovered that the following code compiles when it should not: class C( T = int, U = int ) {} class C( T = int, U : char = int ) {} void main() { auto c = new C!(int); }What's wrong with that?
Feb 15 2007
Sean Kelly wrote:Bruno Medeiros wrote:The template that matches is the char one, the second one. It matches that one regardless of lexical order. I suspect that's because it is a specialization, thus having more priority. For instance, the following fails with an ambiguity error: class C( T = int, U : int = int ) { pragma(msg,"int");} class C( T = int, U : char = char ) { pragma(msg,"char"); } void main() { //template instance C!(int) matches more than one template declaration auto c = new C!(int); } -- Bruno Medeiros - MSc in CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#DSean Kelly wrote:Oops... you're right. I edited that from my original example: class C( T = int, U = int ) {} class C( T = int, U : char = char ) {} void main() { auto c = new C!(int); } This one shouldn't compile and does. Unless the defaults are always chosen from the lexically first match? SeanP.S. In writing this, I discovered that the following code compiles when it should not: class C( T = int, U = int ) {} class C( T = int, U : char = int ) {} void main() { auto c = new C!(int); }What's wrong with that?
Feb 16 2007
Sean Kelly wrote:Sean P.S. In writing this, I discovered that the following code compiles when it should not: class C( T = int, U = int ) {} class C( T = int, U : char = int ) {} void main() { auto c = new C!(int); }It looks like the compiler doesn't evaluate the template until its used. I'm down with that.
Feb 15 2007