1. ホーム
  2. c++

[解決済み】エラーC7034:配列は括弧付きのイニシャライザで初期化できない

2022-04-16 11:23:40

質問

Windowsマシン上のすべてのウィンドウを列挙し、それらのタイトルの配列をJSユーザーランドに返すネイティブNodeアドオンを書こうとしています。

しかし、このエラーで困っています。

C:\Program Files (x86)↪Microsoft Visual Studio 14.0VCincludexmemory0(655): error C3074: an array cannot be initialized with parenthesized initializer [C:\xampp_htdocs_enum-windows_buildenumWindows.vcxproj]

C:\Program Files (x86)↪Microsoft Visual Studio 14.0VCinclude﹑xmemory0(773): note: See reference to function template instantiation 'void std::allocator<_Ty>::construct<_Objty,char(&)[255]>(_Objty (*),char (&)[255]) being comp. をつけた と [ _Ty=char [255], オブジェクトティ=チャール[255]である。 ]

私の知る限り、私は配列の括弧付き初期化を実行していないのですが?

#include <vector>
#include <node.h>
#include <v8.h>
#include <windows.h>
#include <stdio.h>

using namespace node;
using namespace v8;

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM ptr) {
    std::vector<char[255]>* windowTitles =
        reinterpret_cast<std::vector<char[255]>*>(ptr);

    if (IsWindowVisible(hWnd)) {
        int size = GetWindowTextLength(hWnd);
        char buff[255];
        GetWindowText(hWnd, (LPSTR) buff, size);
        windowTitles->push_back(buff);
    }

    return true;
};

void GetWindowTexts(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);
    Local<Array> arr = Array::New(isolate);
    std::vector<char[255]> windowTitles;

    EnumWindows(
        &EnumWindowsProc, 
        reinterpret_cast<LPARAM>(&windowTitles));

    for (unsigned int i = 0; i < windowTitles.size(); i++) {
        const char* ch = reinterpret_cast<const char*>(windowTitles.at(i));
        Local<String> str = String::NewFromUtf8(isolate, ch);
        arr->Set(i, str);
    }

    args.GetReturnValue().Set(arr);
}

void init(Handle<Object> exports, Handle<Object> module) {
    NODE_SET_METHOD(module, "exports", GetWindowTexts);
}

NODE_MODULE(enumWindows, init);

このエラーはこの行と関係があると思います。

windowTitles->push_back(buff);

私のやり方は甘いのかもしれません。

どうすればいい?

ここで問題が発生します。

windowTitles->push_back(buff);

なぜなら、あなたは に配列を格納することはできません。 std::vector .

リンク先の回答より。

標準ライブラリコンテナに格納されるオブジェクトは、コピー可能でなければなりません。 と代入可能であり、配列はそのいずれでもありません。

おそらく次のようなものを使うのでしょう。配列が std::array<char,255> :

BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM ptr)
{
    std::vector<std::array<char,255>>* windowTitles =
        reinterpret_cast<std::vector<std::array<char,255>>*>(ptr);

    if (IsWindowVisible(hWnd)) {
        int size = GetWindowTextLength(hWnd);
        std::array<char,255> buff;
        GetWindowText(hWnd,(LPWSTR)buff.data(),size);
        windowTitles->push_back(buff);
    }

    return true;
};