簡體   English   中英

錯誤:使用auto調用unique_ptr的隱式刪除的復制構造函數

[英]error: call to implicitly-deleted copy constructor of unique_ptr with auto

我有兩個模板聲明如下:

template < typename T >
      class node {
        public:
          ...
        const unique_ptr < node < T >> & getParent();
        ...
        private:
          ...
        unique_ptr < node < T >> & P; //for parent node
        ...
      };

    template < typename T1, typename T2 >
      class tree {
        public:
          tree(int, T2 & );
        ...
        void travPreord();
        ...
        private:
          ...
      };

在公共方法的定義內

template<typename T1, typename T2> tree<T1,T2>::travPreord() 

我有以下代碼:

template < typename T1, typename T2 > 
    void tree < T1, T2 > ::travPreord() {

      //lambda definition

      function < void(unique_ptr < node < T1 >> & ) > prntNode = [ & ]
      (unique_ptr < node < T1 >> & pN) {

        ...

        if(auto rPN = pN - > getParent()) {

          ...

        }

      };

    }

對於上面if語句條件中的賦值,我從編譯器得到以下錯誤(g ++ 4.2.1):

錯誤:調用隱式刪除的'std :: __ 1 :: unique_ptr>的復制構造函數,std :: __ 1 :: default_delete >>>'if(auto rPN = pN-> getParent()){

錯誤中突出顯示的模板實例化的參數是從main()提供的:

int main() {

      vector < string > v;

      ...

      tree < string, vector < string >> T(v.size(), v);

      T.travPreord();

      ...

      return 0;

    }

我根據以下假設編寫了if語句條件:

  1. 可以將unique_ptr分配給引用。

  2. auto關鍵字應該推導出左值表達式rPN的類型為rvalue表達式pN->getParent()的類型,它返回一個類型unique_ptr<node<T>>&.

所以我不確定這個錯誤的來源。

有誰能指出相同的?

  1. auto關鍵字應該推導出左值表達式rPN的類型為rvalue表達式pN->getParent()的類型,它返回一個類型unique_ptr<node<T>>&

不,類型將是unique_ptr<node<T>>

自動類型推導應用與模板參數推導相同的規則; 忽略表達式的引用部分(即pN->getParent() ),之后也忽略const部分。 所以結果類型是unique_ptr<node<T>>

您需要明確指出它應該是一個引用,例如

auto& rPN = pN - > getParent() // rPN is of type const unique_ptr<node<T>>&
  1. 可以將unique_ptr分配給引用。

當然是的。 問題是rPN不是參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM