C2039 C2228 'get_value_or': не является членом 'network :: basic_string_view ' - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь скомпилировать фрагмент кода, но получаю следующие ошибки:

error C2039: 'get_value_or': is not a member of 'network::basic_string_view<char,std::char_traits<char>>'
note: see declaration of 'network::basic_string_view<char,std::char_traits<char>>'

error C2228: left of '.get_value_or' must have class/struct/union
#include "StdInc.h"
#include <boost/utility/string_ref.hpp>

#include <C:\Users\USER\PROJECT\network\uri\uri.hpp>
#include <C:\Users\USER\PROJECT\network\string_view.hpp>


boost::string_ref scheme = serviceUri.scheme().get_value_or("part1");

if (scheme == "part1")
{
    boost::string_ref hostname = serviceUri.host().get_value_or("localhost");
    int port = serviceUri.port<int>().get_value_or(2800);

Я использую Visual Basi c 2015 Update 3 с Boost 1.57.0

1 Ответ

0 голосов
/ 27 мая 2020

Вы использовали cppnetlib / uri .

Однако через 4 года go у них было (еще одно) нарушение интерфейса :

Заменены аксессоры, возвращающие необязательные объекты string_view, двумя отдельными функциями.

Что еще хуже, они по-прежнему возвращают свернутый вручную string_view вместо стандартного.

Кроме того, в их версии network::optional<> никогда не было get_value_or. Фактически get_value_or предназначен только для Boost, где он устарел в пользу (стандартного) value_or.

Заключение

Используйте has_scheme() аксессор чтобы увидеть, присутствует ли схема. Вы можете сделать из этого необязательное:

#include <boost/utility/string_ref.hpp>
#include <network/uri/uri.hpp>
#include <network/string_view.hpp>
#include <optional>

int main() {
    network::uri serviceUri("http://cpp-netlib.org/");

    network::optional<network::string_view> scheme, hostname, port;

    if (serviceUri.has_scheme())
        scheme = serviceUri.scheme();
    if (serviceUri.has_host())
        hostname = serviceUri.host();
    if (serviceUri.has_port())
        port = serviceUri.port();

    scheme   = scheme.value_or("part1");
    hostname = hostname.value_or("localhost");
    port     = scheme.value_or("2800");
}

В качестве альтернативы вы можете полностью избегать network::optional и network::string_view и просто написать:

#include <network/uri/uri.hpp>
#include <optional>

int main() {
    network::uri serviceUri("http://cpp-netlib.org/");

    std::string const scheme = serviceUri.has_scheme()
        ?  serviceUri.scheme().to_string()
        : "part1";

    std::string const host = serviceUri.has_host()
        ?  serviceUri.host().to_string()
        : "localhost";

    std::string const port = serviceUri.has_port()
        ?  serviceUri.port().to_string()
        : "2800";
}
...