2014-11-18 28 views
5

Mam następujący kod:boost :: lexical_cast nieuznawanie przeciążony operator 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; 
} 

otrzymuję następujący błąd kompilacji z doładowania:

Error 1 error C2338: typ docelowy nie jest ani std :: istream able nor std::wistream stanie

To wydaje się proste wystarczająco, i zostały uderzając głową o biurko do ostatniej godziny. Każda pomoc będzie doceniona!

EDIT: Używam Visual Studio 2013.

Odpowiedz

7

Jest odnośników 2-fazowe podczas zabawy.

Musisz włączyć przeciążenie za pomocą ADL, dzięki czemu lexical_cast znajdzie je w drugiej fazie.

Więc, należy przenieść przeciążenie do nazw mandala

Oto całkowicie stałym przykładem (należy również używać 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

Czym dokładnie jest ADL? –

+2

Często mówię ** ["to hiperłącze"] (http://stackoverflow.com/questions/8111677/what-is-argument-dependent-lookup-aka-adl-or-koenig-lookup/8111750#8111750) ** – sehe

+0

Edytowałem mój post, eliminując obszar nazw 'mandala', który miałem wcześniej. Występuje ten sam błąd. –