9

次のコードがあります。

#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::istream 対応でもありませable nor std::wistream

これは簡単なことのように思えます。私はこの 1 時間、頭を机にぶつけていました。どんな助けでも大歓迎です!

編集: Visual Studio 2013 を使用しています。

4

1 に答える 1

11

2 フェーズのルックアップが行われています。

ADL を使用してオーバーロードを有効にする必要があるためlexical_cast、2 番目のフェーズで検出されます。

したがって、オーバーロードを名前空間に移動する必要があります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";
}

ここに画像の説明を入力

于 2014-11-18T08:44:47.460 に答える