2014-11-18 3 views
5

У меня есть следующий код:подталкивание :: 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; 
} 

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

Ошибка 1 Ошибка C2338: Целевой тип не является ни std :: istream able nor std::wistream способный

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

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

ответ

7

Там в 2 фазы поиска в игре.

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

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

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

Live On 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"; 
} 

enter image description here

+0

Что такое ADL? –

+2

Я склонен говорить ** ["это гиперссылка"] (http://stackoverflow.com/questions/8111677/what-is-is-argument-dependent-lookup-aka-adl-or-koenig-lookup/8111750#8111750) ** – sehe

+0

Отредактировано мое сообщение, исключая пространство имен 'mandala', которое у меня было ранее. Произошла такая же ошибка. –

 Смежные вопросы

  • Нет связанных вопросов^_^