c++ 模板(1) 模板的声明以及类型别名
2017-09-14 21:59
267 查看
模板的前置声明
template <typename> class Foo;template <typename T>
bool operator==(const Foo<T>&, const Foo<T>&);
友元的声明
一对一友好关系
template <typename> Foo;template <typename T>
bool operator==(const Foo<T> &, const Foo<T> &);
template <typename T>
class Object
{
// 每个Object实例将访问权限授予用相同类型实例化的Foo和相等运算符
friend class Foo<T>;
friend bool operator==<T>(const Foo<T> &, const Foo<T> &);
};
通用和特定的模板友好关系
template <typename T> class Pal;class C
{
// 用类C实例化的Pal是C的一个友元
friend class Pal<C>;
// Pal2的所有实例都是C的友元; 这种情况无需前置声明
template <typename T> friend class Pal2;
};
template <typename T> class C2
{
// C2的每个实例将相同实例化的Pal声明为友元; Pal的模板声明必须在作用于之内
friend class Pal<T>;
// Pal2的所有实例都是C2的每个实例的友元,不需要前置声明
template <typename X> friend class Pal2;
// Pal3是一个非模板类, 它是C2所有实例的友元
friend class Pal3;
};
为了让所有实例成为友元, 友元声明中必须使用与类模板本身不同的模板参数.
令模板自己的类型参数成为友元(c++11)
template <typename Type> class Bar { friend Type; // 将访问权限授予用来实例化Bar的类型 };
虽然友元通常来说应该是一个类或是一个函数,但我们完全可以用一个内置类型来实例化Bar.这种与内置类型的友好关系是允许的,以便我们能用内置类型来实例化Bar这样的类.
模板类型别名(c++11)
为类模板定义一个类型别名:template <typename T> using twin = std::pair<T, T>; template <typename T> using partNo = std::pair<T, unsigned>;一个模板类型别名是一族类的别名.
当我们定义一个模板类型别名时,可以固定一个或多个模板参数
相关文章推荐
- 【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器
- 讲解C++中的枚举类型以及声明新类型的方法
- 如何理解C和C++的复杂类型声明
- navicat设置mysql中的int字段以及c++中int类型小细节
- C++类型别名
- C++中的模板比较容易混淆的几个概念:类模板和类成员模板以及函数模板
- C++将模板的声明和定义放置在同一个头文件里
- Effective Modern C++: Item 5 -> 优先选择auto而不是显式类型声明
- C++ 模板判断类型
- 如何理解c和c++的复杂类型声明
- C++中类型注册有的时候,函数找不到定义,可能是相应的头文件中防止重定义的声明,还是用原来的,没有做相应的更新
- C++各基础数据类型长度以及范围(总结)
- c++ 笔记1 类型声明
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)
- 深度剖析C和C++的复杂类型声明
- c++ 模板 声明与实现分开编写(error LNK2001: unresolved external symbol...)
- 再论c++模板之类型识别之如何得到类型信息
- C++ 为什么要同时使用*和&符号?以及什么场合使用这种声明方式?
- C++20171110日志 Static类型的声明
- C++ 类模板中非类型参数的模板参数