在上述代码中,子命令的参数没有被识别的原因是因为在解析命令行参数时,没有将子命令的选项描述添加到总的选项描述中。因此,在解析命令行参数时,子命令的选项描述没有被包含在内,导致子命令的参数无法被识别。

要解决这个问题,需要将子命令的选项描述添加到总的选项描述中。具体来说,需要在parseMicOptionsparseSubntwkOptions函数中,将子命令的选项描述desc添加到总的选项描述allOptions中,如下所示:

void parseMicOptions(int argc, char* argv[], MicOptions& options) {
    po::options_description desc("Options for 'mic' command");
    desc.add_options()
        ("help,h", "help message")
        ("input", po::value<std::string>(&options.input)->required(), "input file")
        ("output", po::value<std::string>(&options.output)->required(), "output file")
        ("threads", po::value<int>(&options.threads)->default_value(1), "number of threads");
    
    // 合并选项描述
    po::options_description allOptions;
    allOptions.add(desc);  // 添加子命令的选项描述

    // Parse command-line arguments
    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(allOptions).run(), vm);
    po::notify(vm);
    if (vm.count("help")) {
        options.help = vm["help"].as<std::string>();
    }
    if (vm.count("input")) {
        options.input = vm["input"].as<std::string>();
    }
    if (vm.count("output")) {
        options.output = vm["output"].as<std::string>();
    }
    if (vm.count("threads")) {
        options.threads = vm["threads"].as<int>();
    }
}

void parseSubntwkOptions(int argc, char* argv[], SubntwkOptions& options) {
    po::options_description desc("Options for 'subntwk' command");
    desc.add_options()
        ("help,h", "help message")
        ("adjacent", po::value<std::string>(&options.adjacent)->required(), "adjacent file")
        ("abundance", po::value<std::string>(&options.abundance)->required(), "abundance file")
        ("output", po::value<std::string>(&options.output)->required(), "output file");
    
    // 合并选项描述
    po::options_description allOptions;
    allOptions.add(desc);  // 添加子命令的选项描述

    // Parse command-line arguments
    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(allOptions).run(), vm);
    po::notify(vm);
    if (vm.count("help")) {
        options.help = vm["help"].as<std::string>();
    }
    if (vm.count("adjacent")) {
        options.adjacent = vm["adjacent"].as<std::string>();
    }
    if (vm.count("abundance")) {
        options.abundance = vm["abundance"].as<std::string>();
    }
    if (vm.count("output")) {
        options.output = vm["output"].as<std::string>();
    }
}

通过将子命令的选项描述添加到总的选项描述中,子命令的参数就能够被正确识别和解析。

下面的C++代码为什么子命令的参数没有被识别:#include omph#include boostprogram_optionshpp#include computeSubnetworkTopologyh#include mich#include iostream#include stringnamespace po = boostprogram_options; 结构体struct MainO

原文地址: https://www.cveoy.top/t/topic/ivXe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录