Компилятору известен тип T . То, что не знает, это то, сколько экземпляров T указано. С точки зрения практической реализации, короткий ответ будет не использовать типы указателей. Вместо этого используйте контейнеры. Так как вы все равно копируете данные узла, накладные расходы минимальны. Явный пример ниже:
template <class T>
class ListNode {
public:
// use a vector as the container
std::vector<T> data;
ListNode<T>* next;
// initializer from pointer primitive
ListNode(const T* ps,size_t elements)
{
data.assign(ps,ps+elements);
}
// copy templated instance
ListNode(const ListNode& arg)
{
data = arg.data;
}
// assignment
ListNode& operator=(const ListNode& arg)
{
if (this != &arg)
{
data = arg.data;
}
return *this;
}
};
Фактическое использование будет примерно таким:
{
const char* ps = "Hello World";
ListNode<char> ln1(ps,strlen(ps));
ListNode<char> ln2 = ln1;
}
Конечно, вы можете получить гораздо более сложные решения, но все они будут включать отслеживание количества экземпляров типа T , на которые указывает ваш указатель.