Параметры шаблона по умолчанию :Почему компилятор жалуется на отсутствие указания аргумента шаблона?

У меня есть этот код:

struct A{};

template<class T = A>
struct B {
    void foo() {}
};

B b; //Error: missing template arguments before 'b'
     //Error: expected ';' before 'b'
     //More errors
b.foo()

Если я сделаю foo()в качестве функции шаблона с той же "подписью" шаблона, компилятор не будет жаловаться на то, что аргументы шаблона не указаны:

struct A {};

struct B {
    template<class T = A>
    void foo() {}
};

B b; //OK
b.foo()

Так почему же мне нужно указать аргумент для класса шаблона с параметром по умолчанию, а не для функции шаблона? Есть ли какая-то тонкость, которую я упускаю?

Причина в том, что из-за ошибки вывода аргумента шаблона наверняка. Но я хочу знать почему.

8
задан Deduplicator 21 October 2018 в 23:14
поделиться