将类型参数传递给自引用指针
Passing type parameter to self-referential pointer
template <class T>
class Node {
private:
T m_value;
//Node* m_ptr; //(1)
//Node<T>* m_ptr; //(2)
};
谁能解释一下上面两种说法(1)和(2)有什么区别?这两个语句似乎都可以编译,但我似乎无法找到 ISO C++ 对它们的说明。
它们是同一回事,因为您在模板中声明了指针,因此当您创建 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
}
他们是"the same"
我认为这就是正在发生的事情,就
而言
Node* m_ptr_n
编译器使类型匹配 class 类型。
如
Node < T>* m_ptr
它创建的是指向 class 模板与 "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)
};
根据 C++ 标准(14.6.1 本地声明的名称)
3 The injected-class-name of a class template or class template
specialization can be used either as a template-name or a type-name
wherever it is in scope. [ Example:
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
— end example ]
因此这些数据成员声明
Node* m_ptr; //(1)
Node<T>* m_ptr; //(2)
是等价的,因为注入的 class 名称 Node
在 class 定义的范围内使用。
template <class T>
class Node {
private:
T m_value;
//Node* m_ptr; //(1)
//Node<T>* m_ptr; //(2)
};
谁能解释一下上面两种说法(1)和(2)有什么区别?这两个语句似乎都可以编译,但我似乎无法找到 ISO C++ 对它们的说明。
它们是同一回事,因为您在模板中声明了指针,因此当您创建 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
}
他们是"the same"
我认为这就是正在发生的事情,就
而言Node* m_ptr_n
编译器使类型匹配 class 类型。
如
Node < T>* m_ptr
它创建的是指向 class 模板与 "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)
};
根据 C++ 标准(14.6.1 本地声明的名称)
3 The injected-class-name of a class template or class template specialization can be used either as a template-name or a type-name wherever it is in scope. [ Example:
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
— end example ]
因此这些数据成员声明
Node* m_ptr; //(1)
Node<T>* m_ptr; //(2)
是等价的,因为注入的 class 名称 Node
在 class 定义的范围内使用。