Простой ответ заключается в том, что C ++ использует (довольно) строгую статическую проверку типов.Node<int>
- это совершенно не связанный тип с Node<double>
, и когда компилятор видит ptr->doSomething()
, он должен знать, вызывать ли Node<int>::doSomething()
или Node<double>::doSomething()
.
Если вам нужен какой-тодинамическая универсальность, на которую будет указывать фактический тип ptr
, будет известна только во время выполнения, вам нужно определить базовый класс и получить его.(Это довольно распространенная идиома для шаблона класса, получаемого из не шаблонной базы, именно для того, чтобы универсальность указателей могла быть решена во время выполнения.)