c++templatesdefault-argumentsclass-templatectad

How to avoid specifying arguments for a class template with default template arguments


If I am allowed to do the following:

template <typename T = int>
class Foo{
};

Why am I not allowed to do the following in main?

Foo me;

But I must specify the following:

Foo<int> me;

C++11 introduced default template arguments and right now they are being elusive to my complete understanding.


Solution

  • Note:

    Foo me; without template arguments is legal as of C++17. See this answer: https://stackoverflow.com/a/50970942/539997.

    Original answer applicable before C++17:

    You have to do:

    Foo<> me;
    

    The template arguments must be present but you can leave them empty.

    Think of it like a function foo with a single default argument. The expression foo won't call it, but foo() will. The argument syntax must still be there. This is consistent with that.