c++ 模板类;具有任意容器类型的函数,如何定义它?

c++ template class; function with arbitrary container type, how to define it?(c++ 模板类;具有任意容器类型的函数,如何定义它?)
本文介绍了c++ 模板类;具有任意容器类型的函数,如何定义它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

好的,简单的模板问题.假设我像这样定义我的模板类:

template类 foo {上市:foo(T const& first, T const& second) : first(first), second(second) {}模板void bar(C& 容器,T const& baz){//...}私人的:第一;T秒;}

问题是关于我的 bar 函数...我需要它能够使用某种标准容器,这就是为什么我包含模板/类型名称 C 部分来定义该容器类型.但显然这不是正确的方法,因为我的测试班然后抱怨:

错误:'bar' 未在此范围内声明

那么我将如何以正确的方式实现我的栏功能?也就是说,作为我的模板类的一个函数,具有任意容器类型......我的模板类的其余部分工作正常(具有不会导致错误的其他函数),这只是一个有问题的函数.

好的,所以特定函数(bar)是一个 eraseInRange 函数,它擦除指定范围内的所有元素:

void eraseInRange(C& container, T const& firstElement, T const& secondElement) {...}

一个如何使用它的例子是:

eraseInRange(v, 7, 19);

在这种情况下,v 是一个向量.

编辑 2:傻我!我应该在我的班级之外声明这个函数,而不是在里面……这是一个非常令人沮丧的错误.无论如何,感谢大家的帮助,虽然问题有点不同,但这些信息确实帮助我构建了函数,因为在找到我原来的问题后,我确实遇到了其他一些令人愉快的错误.所以谢谢你!

解决方案


特征解决方案.

概括不要超过需要,不要少于.

在某些情况下,该解决方案可能还不够,因为它会匹配具有此类签名的任何模板(例如 shared_ptr),在这种情况下,您可以使用 type_traits,非常像 duck-typing(模板通常是鸭式的).

#include //Helper 判断是否有一个用于 T 的 const_iterator.模板结构 has_const_iterator{私人的:模板静态字符测试(类型名 C::const_iterator*);模板静态整数测试(...);上市:枚举 { value = sizeof(test(0)) == sizeof(char) };};//bar() 是为也定义了 const_iterator 的容器定义的//作为 value_type.模板 typename std::enable_if::value,无效>::类型bar(const Container &c, typename Container::value_type const & t){//注意:不需要对 value_type 进行额外检查,检查是为了//已经在函数签名中释放了.}模板 类DoesNotHaveConstIterator {};#include <向量>int主(){std::vectorC;酒吧 (c, 1.2f);DoesNotHaveConstIterator乙;酒吧 (b, 1.2f);//正确编译失败}

一个好的模板通常不会人为地限制它们有效的类型(为什么要?).但是想象一下,在上面的示例中,您需要访问对象 const_iterator,然后您可以使用 SFINAE 和 type_traits 将这些约束放在您的函数上.


或者只是像标准库那样

概括不要超过需要,不要少于.

template void bar (Iter it, Iter end) {for (; it!=end; ++it) {/*...*
                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!
                
上一篇:使用模板访问 C++ 中超类的受保护成员 下一篇:模板是什么意思?在 C++ 中使用空尖括号?
相关文档推荐 编译器如何处理变长数组 How do compilers treat variable length arrays(编译器如何处理变长数组) 从 std::function 调用签名推导出模板参数 Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数) 使用 enable_if 检查成员是否存在 check if member exists using enable_if(使用 enable_if 检查成员是否存在) 具有附加可选模板参数的标准库容器? Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?) C++ 算术提升标头的使用 Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用) 参数包必须位于参数列表的末尾...何时以及为什么? Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)
栏目导航 前端开发问题Java开发问题C/C++开发问题Python开发问题C#/.NET开发问题php开发问题移动开发问题数据库问题 最新文章 • LNK2038:检测到“RuntimeLibrary&quo... • 如何使用 VideoWriter 从 OpenCV 打... • C/C++ 中的无限循环... • Clang C++ 交叉编译器 - 从 Mac OS X... • OSX - 用通过 Homebrew 安装的 4.9 ... • 如何避免 Qt app.exec() 阻塞主线程... • 如何在 MacOS 上安装 Boost?... • 基准测试(python 与 C++ 使用 BLAS)... • 应用程序无法启动,因为它无法找到或... • 如何从 C++ 对象中获取类名?... • CMakeLists.txt:30 (project) 中的 C... • 具有完整 C++11 支持的 Windows C++ ... 热门文章 • LNK2038:检测到“RuntimeLibrary&quo... • 如何使用 VideoWriter 从 OpenCV 打... • C/C++ 中的无限循环... • Clang C++ 交叉编译器 - 从 Mac OS X... • OSX - 用通过 Homebrew 安装的 4.9 ... • 如何避免 Qt app.exec() 阻塞主线程... • 如何在 MacOS 上安装 Boost?... • 基准测试(python 与 C++ 使用 BLAS)... • 应用程序无法启动,因为它无法找到或... • 如何从 C++ 对象中获取类名?... • CMakeLists.txt:30 (project) 中的 C... • 具有完整 C++11 支持的 Windows C++ ... 热门标签 织梦模板 dede 外语学校 竞价网站源码 竞价培训网 门户网站 织梦笑话网 dedecms笑话网 织梦源码 网站建设 搞笑图片 织梦教程 旅游网站源码 织梦旅游网 学校培训 html5 企业织梦源码 医院源码 后台样式 移动营销页 整形医院 大学医院 新手建站 客服代码 洗衣机维修 企业网站 淘宝客 导航菜单 教育网站 学校源码 装修网站 装修模板 美容整形 女性健康 妈妈网 机械源码 建站公司 珠宝首饰 苹果网站 手机资讯 美女图片 织梦模版打包 妇科源码 安卓市场源码 男性时尚网 健康之家 app应用网站 笑话网站 下载站 美女图片网 中医院网站 家装网站源码 QQ网站 标牌网站 魔兽世界网 淘宝客源码 YY网站源码 别墅设计网站 服装搭配网 宝宝起名网 站长网站 婚庆网站 脑科医院源码 笑话源码 肝胆医院 意外怀孕源码 工作室 骨科医院 字幕网站源码 女人网站
网站首页 - 免责声明- 最新公告- 充值相关 - 网站地图 Copyright © 2022-2023 深圳市沃梦达电子商务有限公司 All Rights Reserved. 粤ICP备14083021号