久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

  • <tfoot id='iqO5y'></tfoot>

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

  • <legend id='iqO5y'><style id='iqO5y'><dir id='iqO5y'><q id='iqO5y'></q></dir></style></legend>

      <i id='iqO5y'><tr id='iqO5y'><dt id='iqO5y'><q id='iqO5y'><span id='iqO5y'><b id='iqO5y'><form id='iqO5y'><ins id='iqO5y'></ins><ul id='iqO5y'></ul><sub id='iqO5y'></sub></form><legend id='iqO5y'></legend><bdo id='iqO5y'><pre id='iqO5y'><center id='iqO5y'></center></pre></bdo></b><th id='iqO5y'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='iqO5y'><tfoot id='iqO5y'></tfoot><dl id='iqO5y'><fieldset id='iqO5y'></fieldset></dl></div>
        <bdo id='iqO5y'></bdo><ul id='iqO5y'></ul>
      1. 為模板類重載運(yùn)算符時(shí)的隱式轉(zhuǎn)換

        Implicit conversion when overloading operators for template classes(為模板類重載運(yùn)算符時(shí)的隱式轉(zhuǎn)換)
          <bdo id='e6dRx'></bdo><ul id='e6dRx'></ul>

            <legend id='e6dRx'><style id='e6dRx'><dir id='e6dRx'><q id='e6dRx'></q></dir></style></legend>

              • <i id='e6dRx'><tr id='e6dRx'><dt id='e6dRx'><q id='e6dRx'><span id='e6dRx'><b id='e6dRx'><form id='e6dRx'><ins id='e6dRx'></ins><ul id='e6dRx'></ul><sub id='e6dRx'></sub></form><legend id='e6dRx'></legend><bdo id='e6dRx'><pre id='e6dRx'><center id='e6dRx'></center></pre></bdo></b><th id='e6dRx'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='e6dRx'><tfoot id='e6dRx'></tfoot><dl id='e6dRx'><fieldset id='e6dRx'></fieldset></dl></div>

                  <tfoot id='e6dRx'></tfoot>

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

                    <tbody id='e6dRx'></tbody>
                  本文介紹了為模板類重載運(yùn)算符時(shí)的隱式轉(zhuǎn)換的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

                  問(wèn)題描述

                  限時(shí)送ChatGPT賬號(hào)..

                  我想知道為什么隱式類型轉(zhuǎn)換不適用于類模板上的外部運(yùn)算符重載.這是工作的非模板版本:

                  I would like to know why implicit type conversion doesn't work with outside operator overloading on class templates. Here is the working, non-templated version:

                  class foo
                  {
                  public:
                  
                      foo() = default;
                  
                      foo(int that)
                      {}
                  
                      foo& operator +=(foo rhs)
                      {
                          return *this;
                      }
                  };
                  
                  foo operator +(foo lhs, foo rhs)
                  {
                      lhs += rhs;
                      return lhs;
                  }
                  

                  正如預(yù)期的那樣,以下幾行編譯正確:

                  As expected, the following lines compile correctly:

                  foo f, g;
                  f = f + g; // OK
                  f += 5; // OK
                  f = f + 5; // OK
                  f = 5 + f; // OK
                  

                  另一方面,當(dāng)類 foo 被聲明為一個(gè)簡(jiǎn)單的模板時(shí):

                  On the other hand, when class foo is declared as a simple template like this:

                  template< typename T >
                  class foo
                  {
                  public:
                  
                      foo() = default;
                  
                      foo(int that)
                      {}
                  
                      foo& operator +=(foo rhs)
                      {
                          return *this;
                      }
                  };
                  
                  template< typename T >
                  foo< T > operator +(foo< T > lhs, foo< T > rhs)
                  {
                      lhs += rhs;
                      return lhs;
                  }
                  

                  以下幾行編譯出錯(cuò):

                  foo< int > f, g;
                  f = f + g; // OK
                  f += 5; // OK
                  f = f + 5; // Error (no match for operator+)
                  f = 5 + f; // Error (no match for operator+)
                  

                  我想了解為什么編譯器 (GCC 4.6.2) 無(wú)法使用類模板版本的轉(zhuǎn)換構(gòu)造函數(shù)執(zhí)行隱式類型轉(zhuǎn)換.這是預(yù)期的行為嗎?除了手動(dòng)創(chuàng)建所有必要的重載之外,是否有任何解決方法?

                  I would like to understand why the compiler (GCC 4.6.2) is unable to perform implicit type conversion using the converting constructor for the template version of the class. Is that the expected behaviour? Apart from manually creating all the necessary overloads, is there any workaround for this?

                  推薦答案

                  它不正常工作的原因是隱式類型轉(zhuǎn)換(即通過(guò)構(gòu)造函數(shù))在模板參數(shù)推導(dǎo)期間不適用.但是如果你讓外部操作符成為朋友,那么它就可以工作,因?yàn)轭愋?T 是已知的,允許編譯器調(diào)查可以轉(zhuǎn)換什么來(lái)使參數(shù)匹配.

                  The reason it does not just work is that implicit type conversions (that is, via constructors) do not apply during template argument deduction. But it works if you make the outside operator a friend since then the type T is know, allowing the compiler to investigate what can be casted to make the arguments match.

                  我根據(jù)您的示例(但刪除了 C++11 內(nèi)容)制作了一個(gè)示例,其靈感來(lái)自 Scott Meyers Effective C++(第 3 版)中的第 46 項(xiàng)(有理數(shù)類).您的問(wèn)題幾乎與該項(xiàng)目完全匹配.Scott 還指出……這種朋友的使用與類的非公共部分的訪問(wèn)無(wú)關(guān)."

                  I made an example based on yours (but removed C++11 stuff), inspired by Item 46 (a rational number class) in Scott Meyers Effective C++ (ed 3). Your question is almost an exact match to that item. Scott also notes that ... "this use of friend is not related to the access of non-public parts of the class."

                  這也將允許混合使用 foo<T>, foo 等等,只要可以添加 T 和 U 等等

                  This will also allow work with mixes of foo< T >, foo< U > etc as long as T and U can be added etc.

                  另看這篇文章:C++加法重載歧義

                  #include <iostream>
                  
                  using namespace std;
                  
                  template< class T >
                  class foo
                  {
                  private:
                     T _value;
                  public:
                     foo() : _value() {}
                  
                     template <class U>
                     foo(const foo<U>& that) : _value(that.getval()) {}
                  
                     // I'm sure this it can be done without this being public also;
                     T getval() const { return _value ; }; 
                  
                     foo(const T& that) : _value(that) {}
                  
                     friend const foo operator +(foo &lhs,const foo &rhs) 
                        {
                       foo result(lhs._value+rhs._value); 
                       return result;
                        };
                     friend const foo operator +(foo &lhs,const T &rhsval) 
                        {
                       foo result(lhs._value+rhsval); 
                       return result;
                        };
                     friend const foo operator +(const T &lhsval,foo &rhs) 
                        {
                       foo result(lhsval+rhs._value); 
                       return result;
                        };
                  
                     friend foo& operator +=(foo &lhs,const foo &rhs)
                        {
                       lhs._value+=rhs._value;
                       return lhs;
                        };   
                     friend std::ostream& operator<<(std::ostream& out, const foo& me){
                        return out <<me._value;
                     }
                  };
                  
                  int main(){
                     foo< int > f, g;
                     foo< double > dd;
                     cout <<f<<endl;
                     f = f + g;
                     cout <<f<<endl;
                     f += 3 ;
                     cout <<f<<endl;
                     f = f + 5;
                     cout <<f<<endl;
                     f = 7 + f; 
                     cout <<f<<endl;      
                     dd=dd+f;
                     cout <<dd<<endl;      
                     dd=f+dd;
                     cout <<dd<<endl;      
                     dd=dd+7.3;
                     cout <<dd<<endl;             
                  }
                  

                  這篇關(guān)于為模板類重載運(yùn)算符時(shí)的隱式轉(zhuǎn)換的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

                  【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

                  相關(guān)文檔推薦

                  Why do two functions have the same address?(為什么兩個(gè)函數(shù)的地址相同?)
                  Why the initializer of std::function has to be CopyConstructible?(為什么 std::function 的初始化程序必須是可復(fù)制構(gòu)造的?)
                  mixing templates with polymorphism(混合模板與多態(tài)性)
                  When should I use the keyword quot;typenamequot; when using templates(我什么時(shí)候應(yīng)該使用關(guān)鍵字“typename?使用模板時(shí))
                  Dependent name resolution amp; namespace std / Standard Library(依賴名稱解析命名空間 std/標(biāo)準(zhǔn)庫(kù))
                  gcc can compile a variadic template while clang cannot(gcc 可以編譯可變參數(shù)模板,而 clang 不能)

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

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

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

                            <tfoot id='sGITI'></tfoot>
                              <tbody id='sGITI'></tbody>
                            主站蜘蛛池模板: 日韩欧美二区 | 黑丝一区 | 日产精品久久久一区二区 | 欧美黄色片| 久久青 | 死神来了4无删减版在线观看 | 免费看黄色一级片 | 国产视频一区二区在线观看 | 中文字幕一区二区在线播放 | 在线观看国产小视频 | 国产黄色免费 | 性视频在线 | aaa成人 | 国产精品久久久一区二区 | 午夜专区 | 黄色激情视频在线观看 | 国产精品99精品久久免费 | 久久久夜色精品 | 精品久久一区二区三区 | 91视频亚洲| 福利在线播放 | 亚洲天天干 | 伊人91| 亚洲精选一区 | 欧美97 | 日韩欧美久久 | 欧美综合在线视频 | 成人做爰免费视频免费看 | 五月激情网站 | www性| 国产91清纯白嫩初高中在线观看 | 精品www | 日韩999 | 91成人在线 | 日韩一区精品 | 一级片在线免费观看 | 91福利视频导航 | 无套内谢的新婚少妇国语播放 | 91日韩欧美 | 久久亚洲免费视频 | 黄色免费在线看 |