IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++模版依赖型基类中的 this 作用 -> 正文阅读

[C++知识库]C++模版依赖型基类中的 this 作用

依赖型基类

基类依赖模版参数

template <typename T>
class BBB{
    public:
        void one(int ){}
};

template <typename T>
class DDD : public BBB<T>
{
    public:
        void f()
        {
            one(1); 
        }

};

编译时会有警告:

/home/ubuntu/MyRep/cpp/TestTemplate.cpp:26:4: warning: there are no arguments to ‘one’ that depend on a template parameter, so a declaration of ‘one’ must be available [-fpermissive]
   26 |    one(1); 
      |    ^~~
/home/ubuntu/MyRep/cpp/TestTemplate.cpp: In instantiation of ‘void DDD<T>::f() [with T = int]:
/home/ubuntu/MyRep/cpp/TestTemplate.cpp:124:6:   required from here
/home/ubuntu/MyRep/cpp/TestTemplate.cpp:26:7: warning: ‘one’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
   26 |    one(1); 
      |    ~~~^~~
/home/ubuntu/MyRep/cpp/TestTemplate.cpp:26:7: note: declarations in dependent base ‘BBB<int>’ are not found by unqualified lookup
/home/ubuntu/MyRep/cpp/TestTemplate.cpp:26:7: note: use ‘this->one’ instead

one 函数是非依赖名称(可以理解为:没有依赖于模板参数的名称),编译器在看到时就查找,这时 BBB 还没有实例化,(原因2:并且非依赖型名称不会在依赖型基类中查找),先进行普通查找(作用域内),所以找不到 ‘one’ was not declared in this scope
one 同时也是非受限名称 (可以理解为: 前面没有 -> :: . ), 普通查找没找到函数,进行ADL查找。ADL 查找会从关联类和关联名字空间查找

ADL 规则, 对于给定的类型, 关联类 和 关联名字空间 所组成的集合的准确定义可以通过下列规则来确定:
(1)对于基本类型(int, char等), 该集合为空集
(2)对于指针和数组类型,该集合是所引用类型的关联类和关联名字空间
(3)对于枚举类型,名字空间是名字空间是枚举声明所在的名字空间,对于类成员,关联类是枚举所在的类
(4)对于class(包含联合类型),关联类包括该类本身,他的外围类,直接基类,间接基类。关联名字空间包括每个关联类所在的名字空间。
(5)对于函数类型, 该集合包含所有参数类型和返回类型的关联类和关联名字空间
(6)对于类X的成员指针类型,除了包括成员相关的关联名字空间,关联类,该集合还包括与X相关的关联名字空间和关联类

根据第五条,参数类型int ,返回类型 void, 集合也都是空集,仍然找不到 one 函数,所以 and no declarations were found by argument-dependent lookup at the point of instantiation。 ADL : argument-dependent lookup。

代码改为:

this->one(1);

编译通过, 因为将 one 变成了依赖型名称( 根据依赖型名称定义,如果 -> 左边的表达式类型依赖于模板参数,该受限名称(one)也是依赖型名称),而又根据 C++规则,依赖型名称在实例化时才会进行查找,这是BBB已经被实例化,找到了 one。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:10:02  更:2022-03-08 22:13:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:23:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码