Совет правильности - PullRequest
0 голосов
/ 14 мая 2018

У меня есть функция, которая получает константную ссылку, и мне нужно вызвать функцию библиотеки шаблонов, используя эту ссылку:

std::vector<cv::Size> get_resolutions(const rs2::device& dev)
{
    auto sensor = dev.first<rs2::depth_sensor>();

    //more code    
}


class device
{
public:

    template<class T>
    T first()
    {
        for (auto&& s : query_sensors())
        {
            if (auto t = s.as<T>()) return t;
        }
        throw rs2::error("Could not find requested sensor type!");
    }

    //more code

};

Когда я компилирую с gcc, я получаю эту ошибку:

ошибка: передача 'const rs2 :: device' в качестве аргумента 'this' отбрасывает квалификаторы [-fpermissive]

Я не могу изменить функцию first (), поскольку она является частью внешней библиотеки (librealsense, строка 51 в здесь ). Я не могу удалить const из аргумента функции dev, потому что это приведет к удалению правильности const во многих местах.

Я могу устранить ошибку, удалив const из dev:

auto sensor = const_cast<rs2::device&>(dev).first<rs2::depth_sensor>();

Однако это плохая практика. Есть ли более правильный способ справиться с этой ошибкой? Я безуспешно пробовал следующие варианты:

auto sensor = dev.first<const rs2::depth_sensor>();
auto sensor = const_cast<const rs2::depth_sensor>(dev.first<rs2::depth_sensor>());

но я получаю ту же ошибку с ними.

1 Ответ

0 голосов
/ 14 мая 2018

Я думаю, что есть два возможных решения этой проблемы.Либо вы разрешаете get_resolutions принимать dev по неконстантной ссылке (хотя для этого может потребоваться изменить код на сайте вызовов), либо вы заново внедряете first самостоятельно.

Вариант 1

Просто замените

std::vector<cv::Size> get_resolutions(const rs2::device& dev)

на

std::vector<cv::Size> get_resolutions(rs2::device& dev)

Это, однако, также означает, что вы больше не можете вызывать get_resolutions с временным объектом.

Вариант 2

Однако, глядя на источник библиотеки , я действительно не понимаю, почему first() неконстантен.Все, что он делает, это вызывает query_sensors() (который является const-квалифицированным, а также общедоступным) и обрабатывает результаты: 1

template<class T>
T first()
{
    for (auto&& s : query_sensors())
    {
        if (auto t = s.as<T>()) return t;
    }
    throw rs2::error("Could not find requested sensor type!");
}

Это может бытьвариант с наименьшим влиянием: просто определите first() самостоятельно, вне библиотеки, которая копирует эту функциональность:

template <class T>
T custom_first(const rs2::device& dev)
{
    for (auto&& s : dev.query_sensors())
        if (auto t = s.as<T>())
            return t;
    throw rs2::error("Could not find requested sensor type!");
}

1 Время для отправки отчета об ошибке, может быть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...