Шаблоны имеют концепцию dependent name
и non-dependent name
. Проще говоря, это те имена, которые так или иначе зависят от параметра шаблона. В вашем коде 'T * p' делает 'p' зависимым именем, поскольку оно зависит от параметра шаблона T
Теперь cout << p[i]
требуется перегрузка operator <<
, вот так
ostream& operator << (ostream &os, T const &t);
или перегрузка operator <<
, в которую можно преобразовать 'T'.
Но доступна ли такая перегрузка? Как компилятор узнает об этом до тех пор, пока не станет известен «T»?
Это именно то, о чем говорит приведенная выше цитата из Стандарта.
Имена, такие как 'i' и т. Д., Не зависят, поскольку они никак не зависят от параметра шаблона. Следовательно, поиск таких независимых имен может быть разрешен немедленно, даже если «Т» неизвестно