错误C7034:无法使用带括号的初始化程序

时间:2016-06-23 13:09:23

标签: c++ visual-c++ v8

我正在尝试编写一个本机Node插件,它枚举Windows机器上的所有窗口,并将其标题数组返回给JS userland。

但是我被这个错误困扰了:

  

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ include \ xmemory0(655):错误C3074:无法使用带括号的初始化程序初始化数组[C:\ xampp \ htdocs \ enum-windows \建立\ enumWindows.vcxproj]

     

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ include \ xmemory0(773):注意:请参阅函数模板实例化'void std :: allocator< _Ty> :: construct< _Objty,char (&)[255]>(_ Objty(*),char(&)[255])'是comp     ILED             同             [                 _Ty = char [255],                 _Objty = char [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);

也许我的做法很天真。

1 个答案:

答案 0 :(得分:6)

问题出现在这里:

windowTitles->push_back(buff);

因为你cannot store an array in std::vector

来自链接的答案:

  

标准库容器存储的对象必须是可复制的   和assignable,并且数组都不是这些。

也许使用以下内容。该数组已替换为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;
};