Nano Hash - криптовалюты, майнинг, программирование

Неоднозначная перегрузка nlohmann json для оператора =

Я получаю эту ошибку компиляции со следующим кодом

#include <iostream>
#include <boost/optional.hpp>
#include "nlohmann_json.hpp"

namespace nlohmann {
template <typename T>
struct adl_serializer<boost::optional<T>> {
  static void to_json(json& j, const boost::optional<T>& opt) {
    if (opt == boost::none) j = nullptr;
    else j = *opt;
  }
  static void from_json(const json& j, boost::optional<T>& opt) {
    if (j.is_null()) opt = boost::none;
    else opt = j.get<T>();
  }
};
}

int main(int argc, char* argv[]) {

  nlohmann::json json;
  boost::optional<std::string> str = json["str"]; // works
  // boost::optional<std::string> str;
  // str = json["str"]; // doesn't work

}

Полное сообщение об ошибке

nlohmann.cc: In function 'int main(int, char**)':
nlohmann.cc:24:19: error: ambiguous overload for 'operator=' (operand types are 'boost::optional<std::__cxx11::basic_string<char> >' and 'nlohmann::basic_json<>::value_type {aka nlohmann::basic_json<>}')
   str = json["str"];
                   ^
In file included from /opt/gcc-7.2.0/include/boost/optional.hpp:15:0,
                 from nlohmann.cc:2:
/opt/gcc-7.2.0/include/boost/optional/optional.hpp:1019:15: note: candidate: boost::optional<T>& boost::optional<T>::operator=(const boost::optional<T>&) [with T = std::__cxx11::basic_string<char>]
     optional& operator= ( optional const& rhs ) = default;
               ^~~~~~~~
/opt/gcc-7.2.0/include/boost/optional/optional.hpp:1031:15: note: candidate: boost::optional<T>& boost::optional<T>::operator=(boost::optional<T>&&) [with T = std::__cxx11::basic_string<char>]
     optional& operator= ( optional && ) = default;
               ^~~~~~~~
/opt/gcc-7.2.0/include/boost/optional/optional.hpp:1078:15: note: candidate: boost::optional<T>& boost::optional<T>::operator=(boost::none_t) [with T = std::__cxx11::basic_string<char>]
     optional& operator= ( none_t none_ ) BOOST_NOEXCEPT

В чем разница между двумя вариантами использования оператора присваивания? Почему второй не работает?

Я использую GCC 7.2.0 с -std=c++14.


  • В первом случае оператор присваивания не используется. Это инициализация копирования. 15.06.2018
  • Ok. Есть ли способ заставить вторую версию работать? 15.06.2018
  • str = json["str"].get<std::string>(); или str = json["str"].get<boost::optional<std::string>>();. См. github.com/nlohmann/json#implicit-conversions. 15.06.2018
  • Спасибо. Есть ли способ заставить его работать без get? Нужно ли мне перегружать operator=(boost::optional<T>&,nlohmann::basic_json<>)? 15.06.2018
  • Вы не можете перегрузить этот оператор, поскольку у вас нет boost::optional. Вы также можете написать str = boost::optional<std::string>{json["str"]}; 15.06.2018

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..