On Sat, 10 Nov 2012 00:35:05 +0100 "Too Embarrassed To Say" <khea...@eapl.org> wrote: > > auto p3 = Parameterized!(int, double, bool, char)(57, 7.303, > false, 'Z'); // compiles > // but not > // Parameterized!(int, double, bool, char)(93, 5.694, true, 'K') > p4;
That's as expected. Variable declarations are of the form: Type varName; // or Type varName = initialValue; (In the second form, "auto" is optionally allowed to stand in for the type.) And struct literals (ie the actual values of a struct type) are of the form: Type(params) So: - Parameterized is a template - Parameterized!(int, double, bool, char) is a type. - Parameterized!(int, double, bool, char)(93, 5.694, true, 'K') is a *value* of the above type, it's *not* a type. So when you say: Parameterized!(int, double, bool, char)(93, 5.694, true, 'K') p4; That's a value, not a type. So that's just like saying: 5 myInt; // or "Hello" myStr; Which doesn't make sense. What you wanted to say was: int myInt = 5; // or auto myInt = 5; // or string myStr = "hello"; // or auto myStr = "hello"; Therefore, you have to say: auto p3 = Parameterized!(int, double, bool, char)(93, 5.694, true, 'K'); Because *that* is of the form: Type varName = initialValue; If you want an easier way to do it, you can do this: alias Parameterized!(int, double, bool, char) MyType; auto p3 = MyType(93, 5.694, true, 'K') Or, like Ali said, you can make a convenience function.