Параметры шаблона по умолчанию: Почему компилятор жалуется на отсутствие указания аргумента шаблона?
У меня есть этот код:
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;
Даже если вы не хотите указывать ни один из аргументов.