boost::lexical_cast не распознает перегруженный оператор istream

У меня есть следующий код:

#include <iostream>
#include <boost\lexical_cast.hpp>

struct vec2_t
{
    float x;
    float y;
};

std::istream& operator>>(std::istream& istream, vec2_t& v)
{
    istream >> v.x >> v.y;

    return istream;
}

int main()
{
    auto v = boost::lexical_cast<vec2_t>("1231.2 152.9");

    std::cout << v.x << " " << v.y;

    return 0;
}

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

Ошибка 1 ошибка C2338: целевой тип не является ни std::istreamable nor std::wistreamable

Это кажется достаточно простым, и я бился головой о стол в течение последнего часа. Любая помощь будет оценена по достоинству!

EDIT: я использую Visual Studio 2013.


person Colin Basnett    schedule 18.11.2014    source источник
comment
Зря потратил день на это ;(   -  person bsound    schedule 12.11.2020


Ответы (1)


В игре есть двухэтапный поиск.

Вам нужно включить перегрузку с помощью ADL, поэтому lexical_cast найдет ее на втором этапе.

Итак, вы должны переместить перегрузку в пространство имен mandala

Вот полностью исправленный пример (вы также должны использовать std::skipws):

Жить на Coliru

#include <iostream>
#include <boost/lexical_cast.hpp>

namespace mandala
{
    struct vec2_t {
        float x,y;
    };    
}

namespace mandala
{
    std::istream& operator>>(std::istream& istream, vec2_t& v) {
        return istream >> std::skipws >> v.x >> v.y;
    }
}

int main()
{
    auto v = boost::lexical_cast<mandala::vec2_t>("123.1 15.2");
    std::cout << "Parsed: " << v.x << ", " << v.y << "\n";
}

введите здесь описание изображения

person sehe    schedule 18.11.2014
comment
Я склонен говорить это гиперссылка - person sehe; 18.11.2014
comment
Отредактировал свой пост, исключив пространство имен mandala, которое у меня было ранее. Возникает та же ошибка. - person Colin Basnett; 18.11.2014
comment
@cmbasnett Жить на Coliru Я почти уверен, что там связана ли ошибка наблюдения (или ужасно сломанные компиляторы) - person sehe; 18.11.2014
comment
Непосредственное копирование этого кода из Coliru в Visual Studio 2013 и его компиляция приводит к той же ошибке. :С - person Colin Basnett; 18.11.2014
comment
я тоже использую VS 2013, и он компилируется для меня. У вас есть обновление 4? - person sp2danny; 18.11.2014
comment
@cmbasnett Я обнаружил другую ошибку в вашей реализации, см. обновленный ответ. Я тестировал это и на VS2013 (см. Live On Coliru< /b> хотя) - person sehe; 18.11.2014
comment
i.imgur.com/5KgTGxO.png (жалко, как MSVC занимает больше минуты чтобы скомпилировать это на моем ящике, хотя oO) - person sehe; 18.11.2014
comment
@sp2danny Установка обновления 4 сейчас. - person Colin Basnett; 18.11.2014
comment
@cmbasnett Это не обязательно. Я запускаю v120 (RTM). Вероятно, вы просто не заметили, что получили другую ошибку. - person sehe; 18.11.2014