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.

Reply via email to