"Modernes C++" bedeutet meinem Eindruck nach, möglichst auf die Standardbibliothek zurückzugreifen, sofern das Gesuchte denn dort schon implementiert ist. In diesem Fall kann einfach std::list verwendet werden, welche über die Methoden front() und back() verfügt und damit absolut geeignet für Dein Vorhaben ist. Um das Verhalten der Klasse darüber hinaus anzupassen, reicht hier ein Alias aus (C++20):
#include <concepts>
#include <list>
template<typename T> requires std::same_as<T, int>
using MeineListe = std::list<T>;
// MeineListe ist auf den Typ int beschränkt.
Wenn man unbedingt auf eine eigene Implementierung besteht, kann man auch gleich einfach raw pointer verwenden. Der einzige Unterschied ist in den meisten Fällen, dass man daran denken muss, new im Konstruktor und delete im Dekonstruktur aufzurufen:
template<typename T> requires std::same_as<T, int>
class Node
{
public:
T* pItem;
// ...
Node(const T& item) : pItem(new T(item)) // ...
~Node() { delete this->pItem; }
}