Учитывая
template <typename T>
void f(const T& x) // #1
{
f(x.next);
}
void f(const chain<last>&) // #2
{
}
... вызов f
в теле первого никогда не может вызвать второй f
, потому что второй f
не виден в этой точке.
Итак, если вы попадете в первый f
, то он вернется к первой ошибке.:-) Я говорю здесь о рекурсии времени компиляции, если next
относится к типу, для которого f
еще не создан.
И вызов в main
, ...
int main()
{
f(chain<first>());
}
... обязательно вызывает первый f
, поскольку chain<first>
не соответствует типу аргумента второго f
.
Это приводит к рекурсивному вызову f(
arg типа chain<last>
)
.И при попытке создать экземпляр f
для типа аргумента chain<last>
вы получите ошибку, поскольку в chain<last>
нет атрибута next
.
Относительно кода, который явно компилируется при размещении объявления last
в глобальном пространстве имен я не знаю.Уверены ли вы?Примечание: я не пробовал ничего с настоящим компилятором.
Cheers & hth.,