Deklarowanie znajomych funkcji szablonów wymaga niewiarygodnie nieintuicyjnej składni, nawet w C++! Jakie jest uzasadnienie wyboru składni dla potrzebnej dodatkowej <>
? Czy nie byłoby lepiej używać słowa kluczowego template
?Jakie są przesłanki dotyczące składni wybranej do deklarowania znajomych z szablonu?
Dla tych, którzy nie wiedzą o tym, tutaj jest przykładem tego, co można spróbować zrobić:
template <typename T>
class Foo
{
int x;
friend void bar(Foo<T>);
};
template <typename T>
void bar(Foo<T> f)
{
std::cout << f.x;
}
Jeśli spróbujesz zadzwonić bar(Foo<T>())
, dostaniesz błędy linkera.
Aby rozwiązać ten problem, należy przesłać dalej deklarację bar
(a tym samym Foo
), a następnie umieścić dziwnie umieszczone <>
w deklaracji przyjaciela.
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;
}
Moje pytanie brzmi, jakie jest uzasadnienie składni <>
? Czy nie byłoby bardziej intuicyjnie używać słowa kluczowego template
lub czegoś podobnego?
EDIT: Do wyjaśnienia, już wiem dlaczego <> jest wymagane, co chcę wiedzieć, dlaczego zdecydowali się użyć <> disambiguate go zamiast innego bardziej intuicyjnej składni.
+1 Zastanawiałem to dla długi czas. Na tym polega dyskusja w "Effective C++", ale nie całkiem to rozumiem. – templatetypedef
Mam nadzieję, że ta nieintuicyjna rzecz stanie się intuicyjna w C++ 11 –
@Hades: O ile nie przeoczyłem tego, nic się nie zmieniło pod tym względem dla C++ 11. –