ran*_*nas 17 c++ templates pointers class declaration
template <typename T>
class Node
{...};
int main
{
    Node* ptr;
    ptr = new Node<int>;
}
将无法编译我必须将指针声明为
Node<int>* ptr;
为什么在声明指针时我必须指定类型我还没有创建类,为什么编译器必须知道它将指向哪种类型.并且不可能创建一个通用指针,然后决定我想要分配它的类型.
pro*_*ian 29
模板化在编译时解析类型.将新Node<int>对象分配给它时,指针必须在编译时知道它究竟是什么类型.
Node<int>并且Node<std::vector>二进制文件可能非常不同(对象的二进制布局完全根据模板参数更改),因此将未解析的指针类型指向模板没有任何意义.
您应该首先为节点定义一个公共父类:
class NodeBase
{ ... }
template<typename ValueT>
  class Node : public NodeBase
{
 ...
};
NodeBase* ptr;
简单的答案是因为C++使用(相当)strick静态类型检查.  Node<int>是一个完全不相关的类型Node<double>,当编译器看到时ptr->doSomething(),它必须知道是否调用Node<int>::doSomething()或Node<double>::doSomething().
如果确实需要某种动态泛型,实际类型ptr将指向的只是在运行时才知道,您需要定义一个基类,并从中派生出来.(这是从非模板库派生的类模板的一个相当常见的习惯用法,正是这样才能在运行时解析指针中的通用性.)
为什么在声明尚未创建类的指针时必须指定类型,为什么编译器必须知道它将指向的类型。
您可以使用指针做很多事情,仅列出一些:
为了使编译器生成有效执行这些操作的代码,它需要知道指针的类型。如果将决定推迟到看到指针的类型,那么它将需要:
并且不可能创建通用指针并在事后确定我要分配的类型。
种类...您有很多选择:
void*,但在再次有意义地对着指向类型进行操作之前,您需要手动将其强制转换为该类型:在您的情况下,这意味着将其记录在某个位置,然后针对每种可能性使用单独的代码boost::any<>-非常像void*,但是内置安全性boost::variant<>-更安全,更方便,但是在创建指针时必须列出可能的指向类型Node声明了用于对任何特定类型的对象进行操作的共享函数和成员数据节点,则模板化Node类从该抽象派生,Node并实现函数的特定于类型的版本。然后使用virtual函数通过指向基类的指针来调用它们。