c ++使用from_string创建IP地址会导致lambda错误

时间:2018-03-26 13:59:16

标签: c++ boost lambda

我有一个解析标记参数的main函数。其中一个是IP地址字符串(v4)。我将值保存在char数组中。

然后我将char数组移动到const字符串。

const std::string &str(ip_address);

经过一些验证检查后,我想将此IP地址设置为我的代码使用。

boost::asio::ip::address a = boost::asio::ip::address::from_string(str);

但是,此行会导致错误(intellisense):

  

无法在lambda中引用封闭函数局部变量   身体,除非它在捕获列表中

编译错误:

  

错误C3493:' str'不能隐含地捕获,因为没有   已指定默认捕获模式

如何在不进行硬编码的情况下设置IP地址?

注意:我有2个网络适配器,我需要在每个网络适配器上运行程序,并且我传递了每个网络的IP地址。

编辑:(完整代码部分)

CLASS::Main(int argc, char **argv)
    : io_service(nullptr), server(nullptr), iso_parameters(nullptr), wcs_connection(nullptr), class_protocol(nullptr)
{
    char c;
    char ip_address[20];
    //set_warehouse_argument(argc, argv);
    while( -1 != (c = getopt(argc,argv,"w:i:a:")) )
    {
        switch(c)
        {
            case 'i':
                mydat.instance = atoi(optarg);
                break;
            case 'w':
                /* Processed by set_warehouse_argument */
                break;
            case 'a':
                strcpy_s(ip_address, optarg);
                break;
            default:
                usage(argv[0],"Invalid argument flag passed.");
                exit(1);
        }
    }

    const std::string &str(ip_address);

    if(mydat.instance <= 0 || mydat.instance > 5)
    {
        usage(argv[0],"Invalid or missing instance passed (valid is 1-5).");
        exit(1);
    }

    accept_handler = [this](boost::shared_ptr<iso::connection>& socket, const boost::system::error_code& error) 
    {
        if(error != 0)
        {
            LOG_ERROR(mydat.instance) << "Error on accept: " << error.message();
        }
        else
        {
            /* Kick out the old client if present */
            if(wcs_connection && wcs_connection->state() != tcp_connection::DISCONNECTED)
            {
                LOG_EVENT << "New connection. Closing old client.";
                wcs_connection->close();
            }

            /* Initialize the connection and log the IP address */
            pending_connection = socket;
            auto now = std::chrono::steady_clock::now();
            this->connection_timeout = now;

            boost::asio::ip::tcp::socket &s = pending_connection->socket(); 
            boost::system::error_code ec; 
            boost::asio::ip::address a = boost::asio::ip::address::from_string(str);
            if(ec == 0)
            {
                LOG_EVENT << "Client (socket " << s.native_handle() << ") from " << a.to_string() << " connected.";
            }
            else
            {
                LOG_ERROR(mydat.instance) << "Error on looking up remote endpoint for new client: " << ec.message();
                pending_connection->close();
                pending_connection = nullptr;
            }
        }
    };
}

1 个答案:

答案 0 :(得分:1)

  

我得到了与lambda相关的错误,而我没有编写lambda。

您肯定lambda - accept_handler进行了编码,但您尚未捕获str。将其更改为...

accept_handler = [this, str](boost::shared_ptr<iso::connection>& socket,
                             const boost::system::error_code& error)

话虽如此,你实际上并没有显示accept_handler的声明,所以我仍然在猜测这是问题的根源。