Объявление друзей в функции шаблона включает в себя невероятно неинтуитивный синтаксис, даже для C ++! Каково обоснование выбора синтаксиса для необходимого дополнительного <>
? Разве не имеет смысла использовать ключевое слово template
?
Для тех, кто не знает об этом, вот пример того, что вы можете попытаться сделать:
template <typename T>
class Foo
{
int x;
friend void bar(Foo<T>);
};
template <typename T>
void bar(Foo<T> f)
{
std::cout << f.x;
}
Если вы попытаетесь позвонить bar(Foo<T>())
, вы получите ошибки компоновщика.
Чтобы решить эту проблему, вы должны переслать объявление bar
(и, следовательно, Foo
), а затем вставить странное место <>
в объявление друга.
template <typename T> class Foo;
template <typename T> void bar(Foo<T>);
template <typename T>
class Foo
{
int x;
friend void bar<>(Foo<T>); // note the <> (!?)
};
template <typename T>
void bar(Foo<T> f)
{
std::cout << f.x;
}
Мой вопрос: в чем смысл синтаксиса <>
? Разве не было бы более интуитивно понятно использовать ключевое слово template
или что-то в этом роде?
РЕДАКТИРОВАТЬ: Чтобы уточнить, Я уже знаю , почему требуется <>, я хочу знать, почему они решили использовать <> для устранения неоднозначности, вместо некоторого другого более интуитивного синтаксиса .