template <class T>
class Node {
private:
T m_value;
//Node* m_ptr; //(1)
//Node<T>* m_ptr; //(2)
};
有人可以解释上述两个陈述(1)和(2)之间的区别吗?这两个陈述似乎都在编译,但我似乎无法找到ISO C ++对它们所说的内容。
答案 0 :(得分:10)
它们是相同的,因为您在模板中声明指针,因此当您创建Node
的实例时,编译器知道T
是什么。如果可以推导出模板,则不必指定模板的类型,例如来自参数类型,或者在这种情况下来自指针所属的模板实例。
template <class T>
class Node {
public:
T m_value;
Node* m_ptr; //(1)
//Node<T>* m_ptr; //(2)
};
int main()
{
Node<float> test;
test.m_ptr = new Node<float>{}; // valid
test.m_ptr = new Node<bool>{}; // invalid - triggers compiler error
auto val = test.m_ptr->m_value; // val will be of float type
}
答案 1 :(得分:9)
根据C ++标准(14.6.1本地声明的名称)
3类模板或类模板的inject-class-name 专业化可以用作模板名称或类型名称 无论在哪个范围内。 [例如:
template <class T> struct Base {
Base* p;
};
template <class T> struct Derived: public Base<T> {
typename Derived::Base* p; // meaning Derived::Base<T>
};
template<class T, template<class> class U = T::template Base> struct Third { };
Third<Base<int> > t; // OK: default argument uses injected-class-name as a template
- 结束示例]
因此这些数据成员声明
Node* m_ptr; //(1)
Node<T>* m_ptr; //(2)
是等效的,因为注入的类名Node
用在类定义的范围内。
答案 2 :(得分:0)
他们是“相同的”
我认为这就是它发生的事情,在
的情况下节点* m_ptr_n
编译器使类型与类类型匹配。
在
的情况下节点&lt; T> * m_ptr
它创建的是指向类巫婆模板与“T”类型匹配的指针。
如果要获取指向float实例的int实例,可以将两种类型都传递给模板。
template <class T1, class T2, class T3>
class Node {
public:
T1 m_value;
// Node* m_ptr_n; //(1)
Node<T2, T3>* m_ptr; //(2)
};