none
(暗黙的に宣言)は参照できません -- これは削除された関数です の解決法 RRS feed

  • 質問

  • だいぶ簡略化していますが、WCHAR文字列の配列領域を獲得してスマートポインタで管理しようとするプログラムです。このプログラムのメイン側で宣言した arrayコンテナを渡そうとすると Sub(subs) のところで

    (暗黙的に宣言)は参照できません -- これは削除された関数です

    という見慣れないエラーとなりビルド出来ません。Sub メソッド内でSubsを移動して宣言すれば問題なくビルドできますが、それでは使えません。

    VC++ の何らかの制約があるのではないかと思い、質問です。

    #include <Windows.h>
    #include <memory> // std::unique_ptr
    #include <array>
    #include <iostream>
    
    #define NUM_SUB (50)
    
    int Sub(std::array<std::unique_ptr<WCHAR[]>, NUM_SUB> Subs)
    {
        PWSTR pw;
    
        for (size_t i = 0; i < NUM_SUB; i++) {
            Subs[i] = std::unique_ptr<WCHAR[]>(new WCHAR[MAX_PATH]);
            pw = (PWSTR)Subs[i].get();
        }
    }
    
    int main()
    {
        std::cout << "Hello World!\n";
        std::array<std::unique_ptr<WCHAR[]>, NUM_SUB> subs{};
    
        Sub(subs);
    }
    

    (暗黙的に宣言)は参照できません -- これは削除された関数です

    2021年10月26日 14:11

回答

  • たぶんやりたいのは

    int Sub(std::array<std::unique_ptr<WCHAR[]>, NUM_SUB>& Subs)

    で参照渡し(&)したいのでは?

    参照渡しをしない場合はSub(subs)でsubsのコピーが必要になります。
    ですが、unique_ptrはコピーできない(できてはまずい)のでコピーコンストラクタを使えないように削除してあるので、よびだそうとしたコピーコンストラクタは削除された関数(削除されたコンストラクタ)ですとなります。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2021年10月26日 16:58

すべての返信

  • たぶんやりたいのは

    int Sub(std::array<std::unique_ptr<WCHAR[]>, NUM_SUB>& Subs)

    で参照渡し(&)したいのでは?

    参照渡しをしない場合はSub(subs)でsubsのコピーが必要になります。
    ですが、unique_ptrはコピーできない(できてはまずい)のでコピーコンストラクタを使えないように削除してあるので、よびだそうとしたコピーコンストラクタは削除された関数(削除されたコンストラクタ)ですとなります。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2021年10月26日 16:58
  • ありがとうございます。まさしくそれでした。参照渡しをすればよかったのです。

    意味不明なメッセージで悩まされましたが、つまりコピー渡しができないという意味でのメッセージだったのですね。ありがとうございます。

    2021年10月27日 0:28