template <typename T>
class Node
{...};
int main
{
Node* ptr;
ptr = new Node<int>;
}
如果我没声明指针,编译会失败。
Node<int>* ptr;
为什么在声明尚未创建的类的指针时必须指定类型,编译器为什么需要知道它将要指向哪种类型。是否不可能创建一个通用指针,之后再决定要分配哪种类型。
template <typename T>
class Node
{...};
int main
{
Node* ptr;
ptr = new Node<int>;
}
如果我没声明指针,编译会失败。
Node<int>* ptr;
为什么在声明尚未创建的类的指针时必须指定类型,编译器为什么需要知道它将要指向哪种类型。是否不可能创建一个通用指针,之后再决定要分配哪种类型。
模板在编译时解析类型。当您将新的Node<int>
对象分配给它时,指针必须在编译时确切地知道它是什么类型。
Node<int>
和Node<std::vector>
在二进制文件中可能非常不同(根据模板参数,对象的二进制布局会完全改变),因此将未解析的指针类型指向模板没有任何意义。
您应该先为节点定义一个公共父类:
class NodeBase
{ ... }
template<typename ValueT>
class Node : public NodeBase
{
...
};
NodeBase* ptr;
Node<int>
和 Node<std::vector>
周围加上反引号,以将它们格式化为代码而不是文本。如果没有这种格式化,该句话读作“Node和Node可能非常不同”,这没有意义。 - Mike SeymourNode<int>
和 Node<double>
是完全不同的类型,当编译器看到ptr->doSomething()
时,必须确定是调用Node<int>::doSomething()
还是Node<double>::doSomething()
。ptr
所指向的实际类型,您需要定义一个基类,并从其中派生出子类。(这是一种相当常见的模式,即类模板派生自非模板基类,以便于指针的通用性可以在运行时解析。)Node
这样的类型,因此您无法创建指向它的指针实例。您需要重新考虑如何设计和编写您的代码。
Node
不是一种类型,而是一个模板。虽然它确实是一个类模板,但只有像Node<int>
、Node<double>
或Node<Node<void> >
这样的东西才是类型;Node
将永远是一个模板,并且只有指向类型的指针,不存在指向模板的指针。 - Luc DantonNode<int>* ptr = new Node<int>();
吗?我认为应该加上()
。 - enthusiasticgeek