模板继承:没有依赖于模板参数的参数[重复]

2023-12-27

我在编译以下代码时遇到了这个错误。 经过一些研究并阅读不同情况下的类似错误后,我想出了我需要的解决方案。 但我并没有完全理解错误的根本原因和修复方法。

template <typename T>
class TestA {
    int a;
    T temp;

protected:
    int b; 

public: 
    int c;

    TestA(T te): a{10}, b{20}, c{30}, temp{te} {}

    int geta(){ return a; }
    int getb(){ return b; }
    int getc(){ return c; }
};

template <typename T>
class TestB {
    int atb;
    T tempb;

protected:
    int btb; 

public: 
    int ctb;

    TestB(T te) atb{10}, btb{20}, ctb{30}, tempb{te} {}
};

template <typename T>
class TestInh : public TestA<T>, public TestB<T> {
    int aa;
    T temptemp;

protected:
    int bb; 
    int b;

public: 
    int cc;

    TestInh(T te) : TestA<T>{te}, TestB<T>{te}, bb{10000}, b{-1000} {}

    int get_total() {
        // The error happens here!
        return geta();
    }
};

int main(int argc, char const *argv[]) {
    char text = 'a';
    TestInh<char> test(text);

    //std::cout << test.geta() << std::endl;
    std::cout << test.get_total() << std::endl;
    //std::cout << test.c << std::endl;
    return 0;
}

编译此代码时,我收到此错误:

testtemplate.cc: In member function ‘int TestInh<T>::get_total()’:
testtemplate.cc:54:32: error: there are no arguments to ‘geta’ that depend on a template parameter, so a declaration of ‘geta’ must be available [-fpermissive]
int get_total() {return geta();}
                            ^
testtemplate.cc:54:32: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)

通过调用即可解决this->geta()而不仅仅是geta(),但我不完全理解为什么编译器无法解决这个问题。

有人可以解释一下为什么吗?


当扩展依赖于模板参数的类时,this有点成为一个从属名称。

问题是,在执行两个阶段名称查找时,编译器无法知道在哪里可以找到该函数geta()。他不知道它来自父母。因为模板专业化是一件事,TestA<int> and TestA<double>可能是两个完全不同的类,具有不同的功能和成员。

随着this添加了关键字,编译器知道geta()必须是成员函数。

如果没有它,它可能是成员函数或非成员函数,或者是TestB.

想象一个模板代码,它将调用一个函数geta() from TestA and geta() from TestB取决于一些模板条件。哎哟。编译器希望确保每个模板实例化的代码都是一致的。

另一种向编译器表明该函数作为成员函数存在的方法是添加一条 using 语句:

template <typename T> 
struct TestInh : TestA<T>, TestB<T> {
    // some code...
    
    using TestA<T>::geta;
    
    int get_total() {
        // works! With the above using statement,
        // the compiler knows that 'geta()' is
        // a member function of TestA<T>!
        return geta();
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板继承:没有依赖于模板参数的参数[重复] 的相关文章

随机推荐

  • 如何使用新的 YouTube iframe 样式代码嵌入高质量视频

    我正在使用 youtubes 新的 iframe 代码来嵌入视频 但视频的质量似乎比我在 youtube 上观看的质量要低 有没有办法嵌入高质量的视频 我现在的代码是 vq hd720 或 vq hd1080 解决了其他方法都失败的问题
  • 导入错误:libcublas.so.10.0:无法打开共享对象文件:没有这样的文件或目录

    我已经在 Ubuntu 18 04 上安装了 Cuda 10 1 和 cudnn 它似乎已正确安装为 nvcc 和 nvidia smi 类型 我得到了正确的响应 user nvcc V nvcc NVIDIA R Cuda compile
  • 理解java线程中的“优先级”

    我是 java 和线程世界的新手 我刚刚浏览了如下示例代码 package com alice learnthread class NewThread implements Runnable Thread t long clicker 0
  • Symfony:如何在注销后显示成功消息

    在Symfony中 用户成功注销后 如何显示 您已成功注销 之类的成功消息 1 创建一个新服务来处理注销成功事件 In services yml添加服务 logout success handler class Path To YourBu
  • 带有 ImportMany 和 ExportMetadata 的 MEF

    我刚刚开始使用托管可扩展性框架 我有一个导出的类和一个导入语句 Export typeof IMapViewModel ExportMetadata ID 1 public class MapViewModel ViewModelBase
  • 从 get_the_post_thumbnail($post->ID) 获取图片源;

    我必须从下面的代码中获取图像源 thumburl get the post thumbnail post gt ID 我在这里得到 img width 325 height 202 src http localhost TantraProj
  • 将因子转换为整数,同时保持因子级别排序

    我有一个 R 数据框 其中一列是一个因子 其级别具有隐式排序 如何将因子水平转换为特定整数通过以下方式 强烈不同意 gt 1 有点不同意 gt 2 中立 gt 3 有点同意 gt 4 强烈同意 gt 5 例如 这是我的数据框 agree l
  • 调试地图插入?

    我在向地图中插入条目时遇到问题 include
  • 循环范围与循环数组之间的性能差异

    循环遍历某个范围与将相同范围分配给数组并循环数组时 性能 速度 会有什么差异吗 循环遍历数组比查找范围要快得多 请参阅下面我的测试 Option Explicit Const strRANGE ADDRESS As String A1 A1
  • 如何禁用触摸 UIBarButtonItem 时出现的灯光?

    我有一个工具栏UIBarButtonItem风格 UIBarButtonItemStylePlain 我想知道如何禁用触摸时出现的灯光 UIButton has showsTouchWhenHighlighted财产 但没有这样的东西UIB
  • C# 如何将不规则日期和时间字符串转换为DateTime?

    我有一个程序可以将不规则的日期和时间字符串转换为系统日期时间 但由于系统无法识别不规则字符串 因此 ParseExact toDateTime和TryParse方法不起作用 程序只需要转换两种类型的日期时间字符串 Thu Dec 9 05
  • 无需复制/粘贴代码即可实现 TObjectList 的排序

    我有一个对节点树中的节点进行排序的过程 虚拟树视图 http www lischke online de index php controls virtual treeview 从 FMM4 报告中提取的所有内存泄漏都存储在 TMemory
  • 颤动的一叠卡片

    我正在尝试创建一堆卡片 相互叠加并偏移 以可视化卡片的多个版本 我尝试过将卡片放入卡片中 但没有找到抵消它们的方法 我也尝试过使用 stack 类 但没有成功 有人知道我怎样才能达到这个效果吗 您使用 Stack 的方向是正确的 您只需要弄
  • 循环遍历列表以创建多个 Excel 文件

    您好 我正在尝试循环遍历列表以创建多个 Excel 文件 不是工作表 我能够在下面的代码中创建单独的数据框 但我想知道是否有人有通过循环列表创建多个 Excel 文件并使用每个公司名称创建多个 Excel 文件的示例 from dateti
  • 向量的模式匹配“case Nil”

    读完这篇文章后post https stackoverflow com a 10199441 409976关于如何使用模式匹配Vector 或任何实现的集合Seq 我在这个集合上测试了模式匹配 scala gt x Vector res38
  • 如何使用python opencv找到图像中黑色物体的中心?

    我在白色背景上查找黑色物体的轮廓时遇到问题 在这里我添加了一个图像的示例 现在我需要找到黑色区域的中心 我使用以下代码 im cv2 imread img plt imshow im gray cv2 cvtColor im cv2 COL
  • symfony 2:命名空间“Acme”不包含任何映射实体

    我正在关注这本书和页面http symfony com doc current book doctrine html http symfony com doc current book doctrine html 在阅读这本书时 我试图处理
  • 数据分析任务 - 自定义分析请求

    是否有任何选项可以为 SSIS 数据分析任务创建自定义配置文件请求 目前 SSIS 数据分析任务下有 5 个标准分析请求 列空比率配置文件请求 列统计资料请求 列长度 分布配置文件请求 列值分布配置文件请求 候选人关键资料请求 我需要添加另
  • 缩短 Angular 7 中的 SCSS 导入路径

    当我创建一个组件时 它嵌套得很深 如果我想导入一个共享的 scss 我必须用很长的路径导入它 例如 import app shared scss 这不会发生在 ts文件 我可以配置tsconfig json paths src src ap
  • 模板继承:没有依赖于模板参数的参数[重复]

    这个问题在这里已经有答案了 我在编译以下代码时遇到了这个错误 经过一些研究并阅读不同情况下的类似错误后 我想出了我需要的解决方案 但我并没有完全理解错误的根本原因和修复方法 template