<small id='UQcvy'></small><noframes id='UQcvy'>

    1. <tfoot id='UQcvy'></tfoot>
      • <bdo id='UQcvy'></bdo><ul id='UQcvy'></ul>
      <i id='UQcvy'><tr id='UQcvy'><dt id='UQcvy'><q id='UQcvy'><span id='UQcvy'><b id='UQcvy'><form id='UQcvy'><ins id='UQcvy'></ins><ul id='UQcvy'></ul><sub id='UQcvy'></sub></form><legend id='UQcvy'></legend><bdo id='UQcvy'><pre id='UQcvy'><center id='UQcvy'></center></pre></bdo></b><th id='UQcvy'></th></span></q></dt></tr></i><div id='UQcvy'><tfoot id='UQcvy'></tfoot><dl id='UQcvy'><fieldset id='UQcvy'></fieldset></dl></div>
      1. <legend id='UQcvy'><style id='UQcvy'><dir id='UQcvy'><q id='UQcvy'></q></dir></style></legend>

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

        时间:2023-05-25
          <i id='Qykfw'><tr id='Qykfw'><dt id='Qykfw'><q id='Qykfw'><span id='Qykfw'><b id='Qykfw'><form id='Qykfw'><ins id='Qykfw'></ins><ul id='Qykfw'></ul><sub id='Qykfw'></sub></form><legend id='Qykfw'></legend><bdo id='Qykfw'><pre id='Qykfw'><center id='Qykfw'></center></pre></bdo></b><th id='Qykfw'></th></span></q></dt></tr></i><div id='Qykfw'><tfoot id='Qykfw'></tfoot><dl id='Qykfw'><fieldset id='Qykfw'></fieldset></dl></div>

          <small id='Qykfw'></small><noframes id='Qykfw'>

            <tbody id='Qykfw'></tbody>

              • <bdo id='Qykfw'></bdo><ul id='Qykfw'></ul>

                  <tfoot id='Qykfw'></tfoot>
                1. <legend id='Qykfw'><style id='Qykfw'><dir id='Qykfw'><q id='Qykfw'></q></dir></style></legend>
                  本文介绍了c++ 模板类;具有任意容器类型的函数,如何定义它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  限时送ChatGPT账号..

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

                  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) {/*...*

                  • <small id='LWxkP'></small><noframes id='LWxkP'>

                        <bdo id='LWxkP'></bdo><ul id='LWxkP'></ul>
                        <tfoot id='LWxkP'></tfoot>
                      • <legend id='LWxkP'><style id='LWxkP'><dir id='LWxkP'><q id='LWxkP'></q></dir></style></legend>

                          <i id='LWxkP'><tr id='LWxkP'><dt id='LWxkP'><q id='LWxkP'><span id='LWxkP'><b id='LWxkP'><form id='LWxkP'><ins id='LWxkP'></ins><ul id='LWxkP'></ul><sub id='LWxkP'></sub></form><legend id='LWxkP'></legend><bdo id='LWxkP'><pre id='LWxkP'><center id='LWxkP'></center></pre></bdo></b><th id='LWxkP'></th></span></q></dt></tr></i><div id='LWxkP'><tfoot id='LWxkP'></tfoot><dl id='LWxkP'><fieldset id='LWxkP'></fieldset></dl></div>
                            <tbody id='LWxkP'></tbody>