将类型参数传递给自引用指针
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
}
根据C++标准(14.6.1 本地声明的名称(
3 类模板或类模板的注入类名 专用化可以用作模板名称或类型名称 无论它在范围内。[ 示例:
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
用于类定义的作用域。
它们是"相同的">
我认为这就是它正在发生的事情,在
节点* m_ptr_n
编译器使类型与类类型匹配。
在以下情况下:
节点
* m_ptr
它创建的是一个指向与"T"类型匹配的类女巫模板的指针。
如果要获取指向浮点实例的 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++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 自引用 c++20 概念
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 自引用类
- 为什么此自定义指针类会崩溃?
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 如何破坏包含自指指针的对象
- 如何为具有自引用指针的类实现复制构造函数/赋值运算符
- 自引用指针算术
- 为什么在c++中可以将解引用指针自增为常量数据?