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

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

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()

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

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

3 ответа

Решение

Правильный синтаксис такой ( демо):

B<> b; 

Аргумент по умолчанию A предполагается для шаблона класса B, <> часть говорит компилятору, что B является шаблоном класса и просит его принять параметр по умолчанию в качестве аргумента шаблона.

Правильный синтаксис, как уже упоминал Наваз, таков:

B<> b;

Причина в том, что B это шаблон и B<> является экземпляром шаблона с аргументом по умолчанию A, Но вам нужно <> дифференцировать, когда вы хотите, чтобы экземпляр.

Потому что ты должен сказать, что B это шаблон:

B<> b;

Даже если вы не хотите указывать ни один из аргументов.

Другие вопросы по тегам