C++ 可选参数向量

C++ 可选参数向量,c++,C++,如何制作可选的矢量参数?我在一些线程中读到使用指向向量的指针,但我得到以下错误: redefinition of default argument: parameter 1 代码错误为C2572 void EnumerateProcessInformations(std::vector<DWORD> &o_processId, const std::vector<std::wstring> *o_processName = nullptr) { HAN

如何制作可选的矢量参数?我在一些线程中读到使用指向向量的指针,但我得到以下错误:

 redefinition of default argument: parameter 1
代码错误为C2572

void EnumerateProcessInformations(std::vector<DWORD> &o_processId, const std::vector<std::wstring> *o_processName = nullptr)
{
    HANDLE hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    PROCESSENTRY32W process;
    process.dwSize = sizeof(PROCESSENTRY32W);
    Process32FirstW(hSnapProcess, &process);
    do
    {
        if (process.th32ProcessID != 0)
        {
            o_processId.emplace_back(process.th32ProcessID);
            if (*o_processName != nullptr) { *o_processName.emplace_back(process.szExeFile); }
        }
    } while (Process32NextW(hSnapProcess, &process));
    CloseHandle(hSnapProcess);
}

int main()
{
    std::vector<DWORD> processId;
    EnumerateProcessInformations(processId, nullptr);
    for (auto& p : processId)
    {
        std::cout << p << std::endl;
    }
    getchar();
    return 0;
}
void枚举进程信息(std::vector&o_processId,const std::vector*o_processName=nullptr)
{
HANDLE hSnapProcess=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,NULL);
PROCESSENTRY32W工艺;
process.dwSize=sizeof(PROCESSENTRY32W);
Process32FirstW(hsnaprocess和process);
做
{
if(process.th32ProcessID!=0)
{
o_processId.emplace_back(process.th32ProcessID);
如果(*o_processName!=nullptr){*o_processName.emplace_back(process.szExeFile);}
}
}while(Process32NextW(hSnapProcess和process));
关闭手柄(hsnaprocess);
}
int main()
{
std::向量processId;
枚举ProcessInformation(processId、nullptr);
用于(自动&p:processId)
{

std::cout使用指针有两个问题:

  • 在检查指针是否为
    nullptr
    之前,您正在取消对指针的引用。您不是在检查指针是否为null,而是在检查指针指向的向量是否为null

  • 您将其声明为指向一个
    常量向量
    ,这意味着您不能调用向量上的任何变异方法,如
    emplace\u back

请尝试以下方法:

void EnumerateProcessInformations(..., std::vector<std::wstring> *o_processName = nullptr);

...

void EnumerateProcessInformations(..., std::vector<std::wstring> *o_processName)
{
    ...
    if (o_processName) o_processName->emplace_back(process.szExeFile);
    ...
}
void枚举进程信息(…,std::vector*o_processName=nullptr);
...
void枚举进程信息(…,std::vector*o_进程名)
{
...
if(o_processName)o_processName->emplace_back(process.szExeFile);
...
}

此外,问题中引用的错误是在函数定义中应用的结果。默认参数只能在函数声明中使用。某些结果重新定义了默认参数1@IInspectable是的,但是如果是单独在同一个cpp文件中实现的独立函数,它的声明和定义可能是一回事。OP代码的呈现方式可能就是这种情况。OP呈现编译器错误的事实足以推断OP发布的代码不完整,并且在定义之前有一个声明。请发布您得到的确切错误消息。“重新定义"不是单词。如果您在非英语系统上运行Visual Studio,请获取英语错误消息。@IInspectable默认参数的错误nessage重新定义:参数1,代码错误C2572。当我检查以解决此问题时,默认参数应未定义。如何使默认参数未定义?@stephenju在某处发布完整代码。是否您是否已声明EnumerateProcessInformation()?