Как вы обнаружили, это не работает:
template<typename node<T>>
Это потому, что токен после typename
должен быть именем, заданным аргументом шаблона, а не комбинацией имени (T) и существующего типа.
Если вы хотите ограничить свой класс шаблона, чтобы убедиться, что он использует узел, вы можете сделать это:
template<typename T>
class list{ /* use node<T> here */ };
Или это, если вы просто хотите сделать предложение, а не жесткое требование:
template<typename T, typename N = node<T>>
class list{ /* use N here */ };
В любом из этих случаев list<int>
будет использовать node<int>
для внутреннего использования.