首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

命名空间中模板友元布尔重载冲突

相关·内容

C++友元&&命名空间&&数据类型&&内联&&重载&&缺省

1.友元 (1)全局函数作为友元 利用友元这个语法,我们可在函数里访问类里面定义的私有成员; 先定义了一个默认构造函数对类里面的成员进行初始化;goodgay是一个全局的函数,我们想要直接打印私有成员变量就会报错...,我们只需要把这个全局函数的定义的第一行放到类里面去,在前面加上friend关键字就可以访问类里面的私有的成员变量bedroom了; (2)类作友元 上面的这段代码比较长,可能比较复杂,但是并不是很难理解...另外,我们需要注意的就是我们这个是在类的外面去写对应的构造函数,我们在累的里面必须要进行相应的声明,而且在类的外面,我们需要先使用类名加上两个冒号指明接下来要写的函数是属于哪个类的; (3)成员函数作友元...,减少编程的过程中因为命名冲突而产生的影响,我们的命名空间里面定义的变量和函数就属于这个命名空间; (2)命名空间只能够在全局区域里面进行使用,不能在主函数里面使用,我们在主函数里面初始化命名空间里面的变量和函数的调用的时候...,我们使用预作用分辨符就可以打印全局变量,示例如下:效果显而易见 3.C++里面新的数据类型 (1)指针&&布尔类型 原来我们学习的C语言里面的空指针是NULL,在C++里面,我们使用nullptr代表空指针

4610

【C++初阶】C++入门

19、friend 友元。使其不受访问权限控制的限制。例如,在1个类中,私有变量外部是不能直接访问的。...可是假如另外1个类或函数要访问本类的1个私有变量时,可以把这个函数或类声明为本类的友元函数或友元类。这样他们就可以直接访问本类的私有变量。...public为公有的,访问不受限制;protected为保护的,只能在本类和友元中访问;private为私有的,只能在本类、派生类和友元中访问。...命名空间分为三种:  1.普通的命名空间  namespace N1 // N1为命名空间的名称 {  // 命名空间中的内容,既可以定义变量,也可以定义函数  int a;  int Add(int...同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

1.3K30
  • 【C++修行之道】命名空间 、C++输入&输出、缺省参数和函数重载

    friend 友元声明 class 类定义 extern 外部变量或函数声明 operator 操作符重载 switch switch语句 virtual 虚函数修饰符 register 寄存器变量修饰符...(已弃用) const 常量修饰符 false 布尔值false private 访问修饰符(私有) true 布尔值true template 模板定义 float 单精度浮点数类型 void 无返回类型...使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。...同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。...,命名空间中的所有内容都局限于该命名空间中 2.2 命名空间使用 // 编译默认查找 // a、当前局部域 : 自留地 // b、全局域找 : 村子野地 // c、到展开的命名空间中查找

    7200

    C++为什么有参数依赖查找(ADL)?

    对于函数和函数模板名称,名称查找可以将多个声明与同一名称关联起来,并且可能从参数依赖查找中获得额外的声明(模板参数推导也可能适用),这一组声明集被传递给重载解析,来选择最终要使用的声明。...在查找时,还存在一些特殊的规则,以下仅举两例:比如在查找域运算符::左边的名字时,会忽略函数、变量、枚举等,只有类型名称会被查找在类内部声明的友元函数,其名称查找规则与成员函数相同。...在类外部定义的友元函数,其查找规则与命名空间中的函数相同。限定名称查找限定名称查找用于处理在作用域解析操作符::右侧出现的名称。...查找合并:将普通未限定查找找到的声明集合与ADL找到的声明集合合并,并应用特殊规则,例如,通过ADL可见的关联类中的友元函数和函数模板,即使它们在普通查找中不可见。...避免命名冲突:ADL通过在参数类型的命名空间中查找函数,减少了全局命名空间的污染,有助于避免命名冲突。

    12110

    C++初阶

    1.命名空间中可以定义变量/函数/类型, 2.命名空间可以嵌套, 3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。...,命名空间中的所有内容都局限于该命名空间中 2.命名空间使用 命名空间的使用有三种方式: 1.加命名空间名称及作用域限定符 int main() { printf("%d\n", N::a);...,不过可以强转直接赋空,不过一般不进行这样的操作 13.友元函数和友元类(Date里有) 问题:现在尝试去重载operator,然后发现没办法将operator重载成成员函数。...所以要将operator重载成全局函数。但又会导致类外没办 法访问成员,此时就需要友元来解决。...友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元。

    10210

    C++初阶大全

    1.命名空间中可以定义变量/函数/类型, 2.命名空间可以嵌套, 3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。...,命名空间中的所有内容都局限于该命名空间中 2.命名空间使用 命名空间的使用有三种方式: 1.加命名空间名称及作用域限定符 int main() { printf("%d\n", N::a);...,不过可以强转直接赋空,不过一般不进行这样的操作 13.友元函数和友元类(Date里有) 问题:现在尝试去重载operator,然后发现没办法将operator重载成成员函数。...所以要将operator重载成全局函数。但又会导致类外没办 法访问成员,此时就需要友元来解决。...友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元。

    5810

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    本P主要的知识点有:【缺省函数】【命名空间域】【函数重载】【引用】【C++中的NULL与空指针区别】【内联函数】【类】【This指针】【const成员/成员函数】【static静态成员 】【explicit...:在实际运用代码的过程中,可能存在局部变量之间命名冲突/库与局部变量命名之间相互冲突的情况,因而我们可以在局部域全局域之外设置一个区域:命名空间域。...但是友元会增加耦合度,破坏了封装,所以友元不宜多用。...友元分为:友元函数和友元类 通俗而言:友元函数的声明表达了友元函数能够访问这个类的权限,相当于客人(友元)函数拥有主人家的钥匙(友元声明),可以随便进出主人家里,偷吃主人家里的饼干(访问私有域成员...友元关系不能传递 (如果B是A的友元,C是B的友元,则不能说明C时A的友元) 友元关系不能继承(在继承板块有详细介绍) 代码演示: class Time { friend class Date

    25610

    【C++初阶】--- C++入门(上)

    阶段 内容 C with classes 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等 C++1.0 添加虚函数概念,函数和运算符重载,引用、常量等 C++2.0 更加完善支持面向对象...使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。...注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。 C++中的四种域:全局域,局部域,命名空间域,类域。...若需展开,要注意的是,展开前在此命名空间中不能有和全局命名相同的变量(在一些大型项目中,要避免展开命名空间域,以免造成不必要的命名冲突)。...如下,操作符重载了,1. 左移操作; 2. 流插入。 两种功能,重载操作后期会详解。

    4400

    C++入门指南(持续更新)

    ... 18 2.3 std标准命名空间... 20 2.4 C++新增的标准输入输出方法(cin和cout) 22 2.5 C++规定的变量定义位置... 24 2.6 C++新增的布尔类型(bool...50 3.7 static静态成员变量... 52 3.8 static静态成员函数... 53 3.9 const成员变量和成员函数... 55 3.10 const对象(常对象) 56 3.11 友元函数和友元类...... 58 3.11.3 友元类... 61 3.12 C++字符串... 62 四、C++面向对象:继承与派生... 75 4.1 继承与派生概念介绍... 75 4.2 继承的语法介绍... 75...... 97 6.1 运算符重载语法介绍... 97 6.2 可重载运算符与不可重载运算符... 98 6.3 一元运算符重载... 99 6.4 二元运算符重载... 102 6.5 关系运算符重载...... 104 6.6 输入/输出运算符重载(>>、<<) 105 6.7 函数调用运算符 () 重载... 106 6.8 重载[ ](下标运算符)... 107 七、C++模板和泛型程序设计... 108

    64810

    CC++编码规范

    避免局部名和外层的名字冲突 用a、an、any 区分重名(参数) 模板类型名应有意义 此外,经典命名规则主要有: (1)匈牙利命名法。...保持类的不同接口在实现原则上的一致性 避免为每个类成员提供访问函数 不要在类定义时提供成员函数体 函数声明(而不是实现)时定义参数的缺省值 恰当选择成员函数、全局函数和友元函数...指针应有一个合理的值 记住给字符串结束符申请空间 2.10操作符 遵守操作符原本的含义,不要创新 确保自定义操作符能和其他操作符混合使用 区分作为成员函数和作为友元的操作符... 仔细区分带缺省值参数的函数和重载函数 确保重载函数的所有版本有共同的目的和相似的行为 避免重载在指针和整型类型上 尽量避免重载在模板类型上 2.15...友元 少用友元 减少拥有友元特权的个数 2.16模板 使用模板如果有限制条件一定要在注释和文档中描述清楚 模板类型应传引用/指针而不是值 注意模板编译的特殊性

    2K20

    【C++入门】—— C++入门 (上)_命名空间

    阶段 内容 C with classes 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等 C++1.0 添加虚函数概念,函数和运算符重载,引用、常量等 C++2.0 更加完善支持面向对象...绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库) C++03 C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性...C++入门知识 (C++兼容C语言的所有语法) 2.1 命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,如果我们取变量名和库中的变量名一样就会发生冲突...就是为了针对这种问题,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染!...x + y; } } } 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中 注意: 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

    13510

    【C++】如何巧妙运用C++命名空间:初学者必备指南

    内容 C with classes类及派生类、公有和私有成员、类的构造和析构、友元...为了避免这种问题出现,C++引入了命名空间来对标识符的名称进行本地化,以避免命名冲突或名字污染命名空间关键字:namespace具体名称冲突用例:报错理由:创建一个整型变量名称为rand,而rand是stdlib.h...,命名空间中的所有内容都局限于该命名空间中说明:C++具有域的概念,目前先阶段所接触到的域有全局、局部作用域、命名空间域。...Add(int x,int y) { return x+y; }}说明:这里重定义不是指命名空间名称冲突,而是当相同名称的命名空间合并同一个命名空间中,变量a名称冲突导致。...(){ printf("%d\n",N::a) return 0;}第二种:使用using将命名空间中某个成员引入(打开某个成员权限)将N命名空间中变量b的权限打开using N::

    20410

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    定义方法是在声明函数名的时候函数体类似显式默认构造的写法改写为=0,只能对虚函数使用这个写法 友元只对被声明的类有效,友元的基类或派生类都不是友元 某个类对其继承来的成员的访问权限受到两个因素的影响:...,其他的要保证对编译器可见 类模板不会推断参数的类型 类模板的成员函数只有在使用时才会实例化 类模板与另一个模板直接最常见的友元是一对一的友元,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参...类模板也可以一对多友元,方法是直接将目标模板的名字标为友元,这样就与目标模板的所有实例都成为了友元。...即使我们需要特例化所有的类型参数也要保留一个空的尖括号做标记 完全的模板特例化的本质是模板的一个实例,而不是重载,因此特例化不会影响函数的匹配。...但如果只是部分特例化的模板则仍然是模板,则依然会参与匹配 我们也可以特例化类模板,此时必须在原模板定义的命名空间中特例化它。

    1.7K10

    C屁屁(c++)万字入门

    它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计 阶段 内容 C with classes 类及派生类、公有和私有成员、类的构造和析构、友元...使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的 本人理解:由于名字可能的冲突,使用命名空间作用于名字的保护墙,当需要访问时,...同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。...,命名空间中的所有内容都局限于该命名空间中 1.2命名空间使用 命名空间中成员该如何使用呢?...或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题 个人理解:在c++开发者大佬,使用命名空间来解决变量名的冲突后,函数重载则是用来解决函数名冲突的另一个方法,类比于命名空间的分类管理

    58710

    【笔记】《C++Primer》—— 第16章:模板与泛型编程

    ,也就是我们并不需要一个完美的模板,只要满足当前类型的实例化即可 在类模板自己的作用域中,也就是函数体或类体部分,我们可以直接使用模板名而不需要实参,就像已经完成了实参匹配一样 类模板与另一个模板直接最常见的友元是一对一的友元...,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参 类模板也可以一对多友元,方法是直接将目标模板的名字标为友元,这样就与目标模板的所有实例都成为了友元。...要注意如果声明了目标友元的模板实参标识符,这些标识符需要与自身类模板的标识符不同 // 需要保证目标友元在作用域中可见 template class friendTemp1;...,模板实参需要写明白 friend class friendTemp2; }; C11中我们可以让模板类型参数自己成为友元,从而提高了灵活性 由于模板不是一个类型(实例化后才是...,而且其中模板在前,特例化版本在最后面 我们也可以特例化类模板,此时必须在原模板定义的命名空间中特例化它。

    1.5K30

    读完某C++神作,我只记下了100句话

    size()返回个数,empty()返回布尔值。 如果容器c为空,c.front() c.back()操作未定义!...友元:将非公有成员的访问权授予指定的类或函数。friend在类定义内部。友元引入的类名和函数(定义或声明)可以像预先声明的一样使用。...使用算法sort等时会假定一些操作符(重载操作符。重载操作符如果是成员函数,左操作数必须是该类的对象【一定是this】。 用函数或类操作某个类的数据可设置其为友元。...派生类应避免与基类成员名字冲突。局部作用域中声明的函数不会重载全局域的函数。派生类定义的函数也不重载基类函数【想重载要么不定义,要么全定义】。using作用域。...非类型形参的模板实参:template 实例化时必须是常量表达式 Screen 模板中的友元表示任何实例可以访问任何实例。模板类中可以有模板类成员。

    1.4K20

    第 18 章 用于大型程序的工具

    模板特例化必须定义在原始模板所属的命名空间中,在命名空间中声明了特例化后,就能在命名空间的外部定义它了。...另一个风险是由 using指示引发的二义性错误,只有在使用了冲突名字的地方才能被发现,这种延后的检测意味着可能在特定库引入很久之后才爆发冲突。...一个另外的未声明的类或函数如果第一次出现在友元声明中,则我们认为它是最近的外层命名空间的成员。这条规则与实参相关的查找规则结合在一起,将产生意想不到的效果。...namespace A { class C { // 两个友元,在友元声明之外没有其他的声明 // 这些函数隐式地成为命名空间 A的成员...); // 根据实参相关的查找规则可以被找到 }; } int main () { A::C cobj; f(cobj); // 正确: 通过在 A::C中的友元声明找到

    99450

    第 18 章 用于大型程序的工具

    模板特例化必须定义在原始模板所属的命名空间中,在命名空间中声明了特例化后,就能在命名空间的外部定义它了。...另一个风险是由 using指示引发的二义性错误,只有在使用了冲突名字的地方才能被发现,这种延后的检测意味着可能在特定库引入很久之后才爆发冲突。...一个另外的未声明的类或函数如果第一次出现在友元声明中,则我们认为它是最近的外层命名空间的成员。这条规则与实参相关的查找规则结合在一起,将产生意想不到的效果。...namespace A { class C { // 两个友元,在友元声明之外没有其他的声明 // 这些函数隐式地成为命名空间 A的成员...); // 根据实参相关的查找规则可以被找到 }; } int main () { A::C cobj; f(cobj); // 正确: 通过在 A::C中的友元声明找到

    93020

    【C++】类和对象核心总结

    namespace域: 命名空间域,这个域里面可以由程序猿来放一些可能与库中函数或关键字起冲突的东东,和类一样,我们也可以选择性的放开命名空间中的功能对外开放,通过利用三种使用命名空间域的方式。...2.将全局重载写成友元函数,下面会讲到友元函数。 4.2 流插入(>)运算符的重载 a....他怎么不会和库里面的重载起冲突啊,因为我们写的和库中的其实构成了重载函数,并未冲突,因为库中的流插入或流输出重载参数只有一个,只要接收对应变量的内置类型即可,而我们重载的流插入和流提取的参数是类的实例化对象...+内部类 1.友元函数 提醒:友元函数的使用场景,我们在重载流插入和流提取运算符的时候提到过,这里只对友元函数的特性进行总结,如果有忘了的同学可以返回去看一下上面的内容。...友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 2.友元类 友元类的所有成员函数都可以是另一个类的友元函数

    76330

    【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 )

    如果要在 类模板 中进行运算符重载 , 就需要用到友元函数 ; 如果将 类模板 的 函数实现 , 定义在函数外部 , 结合 友元函数 使用 , 就变得很复杂 , 下面针对该问题进行讨论 ; 二、普通类的运算符重载..., 左移运算符 重载 是在类外部 通过友元函数实现的 , 因为左移运算符的 左操作数是 ostream& 类型的 , 如果定义在了 类内部 , 左操作数就默认为当前类 ; 代码示例 : #include...三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 1、类模板 的 外部友元函数问题 将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板...示例 ; 问题就出现在 定义在外部的 友元函数 中 , 友元函数 , 不能 读取 和 访问 到 泛型类型 T , 也就是 类模板 中 的 template 泛型类型 T ; 在外部重新定义...template 就是重新定义了一个新的泛型 , 与 类模板 中的 T 不是同一个泛型类型 ; 解决上述问题 , 就需要将 友元函数 定义在 类模板 的内部 ; template

    27210
    领券