2014-11-18 14 views
5

Tôi có đoạn mã sau:boost :: lexical_cast không nhận ra quá tải toán tử 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; 
} 

Tôi nhận được lỗi biên dịch sau đây từ Boost:

Lỗi 1 lỗi C2338: Loại mục tiêu không phải là std :: istream able nor std::wistream có thể

Điều này có vẻ đơn giản, và tôi đã đánh đầu vào bàn làm việc trong một giờ qua. Bất kỳ trợ giúp sẽ được đánh giá cao!

EDIT: Tôi đang sử dụng Visual Studio 2013.

Trả lời

7

Có tra cứu 2-giai đoạn lúc chơi.

Bạn cần bật quá tải bằng ADL, vì vậy lexical_cast sẽ tìm thấy nó trong giai đoạn thứ hai.

Vì vậy, bạn nên di chuyển quá tải vào namespace mandala

Dưới đây là một ví dụ hoàn toàn cố định (bạn cũng nên sử dụng 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 chính xác là gì? –

+2

Tôi có xu hướng nói ** ["đó là một siêu liên kết"] (http://stackoverflow.com/questions/8111677/what-is-argument-dependent-lookup-aka-adl-or-koenig-lookup/8111750#8111750) ** – sehe

+0

Đã chỉnh sửa bài đăng của tôi loại bỏ không gian tên 'mandala' mà tôi đã có trước đó. Cùng một lỗi xảy ra. –