C++ 模板中的名称查找

2024-05-12

我有一些 C++ 代码,如果没有 -fpermissive 选项,就无法再编译。 这是我无法分享的专有代码,但我认为我已经能够提取一个简单的测试用例来演示该问题。这是 g++ 的输出

template_eg.cpp: In instantiation of 'void Special_List<T>::do_other_stuff(T*) [with T = int]':
template_eg.cpp:27:35:   required from here
template_eg.cpp:18:25: error: 'next' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
template_eg.cpp:18:25: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
template_eg.cpp:18:25: note: use 'this->next' instead

所以这是产生问题的代码:

template<class T> class List  
{
        public: 
        void next(T*){
            cout<<"Doing some stuff"<<endl;
        }       
};

template<class T> class Special_List: public List<T>
{
    public:
        void do_other_stuff(T* item){
                next(item);
        }       
};


int main(int argc, char *argv[])
{
    Special_List<int> b;
    int test_int = 3;
    b.do_other_stuff(&test_int);
}

我并不是想找出如何修复代码以使其再次编译。 只需将 next(item) 更改为 this->next(item) 即可 我试图更好地理解为什么这种改变是必要的。 我在这个页面找到了解释:http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html虽然这个解释很有用,但我仍然有一些问题。我的函数采用 T* (指向类型 T 的指针)这一事实不应该使其依赖于模板参数吗? 用我自己的措辞来说,编译器(gcc 4.7)不应该能够找出 next() 函数在基类 List 中吗? 为什么有必要在每个此类调用之前添加 this-> ? 我注意到 clang 3.1 表现出相同的行为,因此我假设 c++ 标准中有一些要求需要这种行为。有人能提供理由吗?


问题是模板分两次处理(根据标准,VS 则不然)。在第一遍中,在类型替换之前,将查找并检查所有不依赖于模板参数的内容。一旦类型被替换,从属名称就会在第二遍中解析。

现在,在第一遍中没有任何迹象表明next依赖于模板参数,因此需要解析类型替换之前。现在,因为基本类型是在当前模板的模板参数上模板化的,所以编译器无法查看它(它可能专门用于某些类型,并且不知道什么类型T我们正在实例化模板,我们不知道要使用哪个专业化,即基础depends on T我们正在检查之前知道T).

添加的技巧this-> turns next到从属名称中,这又意味着查找被延迟到第二遍,其中T是已知的,并且因为T已知,List<T>也是已知的并且可以查到。


EDIT:上面答案的措辞中缺少的一个重要细节是第二阶段查找(类型替换之后)只会添加在参数相关查找期间找到的函数。也就是说,如果next是与关联的命名空间中的自由函数T它会被发现,但它是基地的成员,对于 ADL 来说是不可见的T.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 模板中的名称查找 的相关文章

随机推荐

  • AspNet vNext 上的 Kestrel 不提供 / 下的索引页面

    我需要能够在默认网址下提供我的 index html 使用 Kestrel Web 服务器 现在我只能使用完整路径访问我的静态文件 即 index html 同样 这在 VisualStudio 上完美运行 上下文是带有 Kestrel 的
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • React Native Expo 客户端网络请求失败

    网络请求失败 我尝试过允许端口连接 通过 sudo ufw 允许任何端口命令 但它没有帮助 fetch http 192 XXXXXX form user registration php method POST headers Accep
  • 如何设置管理员批准模型的编辑

    我需要一个普通用户可以编辑模型的系统 但编辑实际上只有在管理员批准后才会发生 我发现了一颗宝石 叫做纸迹 https github com airblade paper trail它确实有模型版本控制 但不具体支持我想要做的事情 我想知道其
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • 使用 CustomUrlHelper 覆盖 UrlHelper - ASP.NET CORE 2.0

    有没有办法强制我的 ASP NET Core 2 0 应用程序使用我在各处编写的自定义 UrlHelper 我有一个具有自定义逻辑的类 public class CustomUrlHelper UrlHelper 我希望它能在任何地方使用
  • 小部件如何确定登录 WireCloud 的用户?

    作为小部件开发人员 我希望根据登录 WireCloud 的用户在小部件中显示不同的信息 小部件如何在加载时确定登录 WireCloud 的用户是谁 WireCloud 支持通过 MashupPlatform API 访问当前可用的上下文信息
  • Powershell SQL Server数据库连接和连接超时问题

    我有一个连接到 SQL Server 2012 数据库的 powershell 脚本 该脚本运行 SQL 查询并将结果集放入数据表中 以将格式化的电子邮件发送给相关方 下面是问题所在的代码片段 CBA New Object System D
  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • 如何在 rmarkdown 中显示带有 results='asis' 的格式化 R 输出

    当使用 results asis 时 有没有办法在 rmarkdown knitr 中显示格式化程序 R 输出 一个例子是以下函数 myfun lt function cat hello n cat c one 1 two 2 然后 该块将
  • 透视切换面板在 Eclipse 中消失

    Eclipse 崩溃后 小透视切换窗格从 Eclipse 窗口的右上角消失了 我下载了最新版本并尝试打开它 使用相同的工作区 但按钮仍然消失 这是一个屏幕截图 并放大 有任何想法吗 我仍然可以通过选择 窗口 gt 打开透视图 来切换透视图
  • Galaxy Nexus 4.1.1 和 ISO14443 读卡器

    是否可以在 Galaxy Nexus Jelly Bean 4 1 1 移动设备和任何常规桌面非接触式读卡器 ISO 14443 A B 之间建立连接 据我所知 android不支持卡模拟模式 所以只能通过p2p模式来完成 p2p 是否基于
  • Python 错误:将 statsmodels 与一行数据一起使用时,对象的 len() 未调整大小

    我可以使用 statsmodel 的 WLS 加权最小二乘回归 http statsmodels sourceforge net devel generated statsmodels regression linear model WLS
  • 在 mvc 中对远程验证的成功响应执行一些操作

    我正在使用远程验证来检查我的 asp net mvc 3 应用程序 C 注册期间用户名的可用性 我使用 MVC 远程属性验证 Remote IsUserNameAvailable User public string UserName ge
  • minmax 失败(属性值无效)

    Chrome 给出了invalid property value并且不尊重CSS grid template columns repeat auto fill minmax auto 1fr 当auto被替换为min content and
  • 绘制对数轴

    我想使用 matplotlib 绘制一张带有一个对数轴的图 我一直在阅读文档 但无法弄清楚语法 我知道这可能很简单 scale linear 在情节争论中 但我似乎无法正确理解 示例程序 import pylab import matplo
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • Oracle 查询向上或向下舍入到最近的 15 分钟间隔

    08 SEP 20 08 55 05 08 SEP 20 15 36 13 下面的查询对于 15 36 13 可以正常工作 因为它四舍五入到 15 30 但 8 55 05 向下舍入到 08 45 而它应该四舍五入到 09 00 selec
  • 我可以为 GitHub Pages 创建多个存储库吗?

    我创建了一个用于在 GitHub 上托管博客的存储库 有什么方法可以创建额外的存储库来托管多个博客 或者我仅限于一个存储库 因为用户名 github io只能使用一次吗 您可以将一个站点发布到https
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o