2011-10-26 18 views
0

boost :: lexical_castに問題があります。 GLM(OpenGL Mathematics)ライブラリのクラスで使用しようとしています。問題のクラスのBoost.LexicalCastを動作させるにはどうすればよいですか?

は字句鋳造を可能にするための 、私が実施している事業者< <機能:

std::cout << glm::ivec2(1, 1) << glm::vec2(1.0f, 1.0f); 

と::

std::stringstream ss("640 480"); 
glm::ivec2 pt; 
ss >> pt; 
std::cout << pt << std::endl; 

template <class T> 
std::ostream& operator<<(std::ostream& out, const glm::detail::tvec2<T>& vec) 
{ 
    out << vec.x << " " << vec.y; 
    return out; 
} 

template <class T> 
std::istream& operator>>(std::istream& in, glm::detail::tvec2<T>& vec) 
{ 
    in >> vec.x; 
    in >> vec.y; 
    return in; 
} 

は、私はそうのような演算子をテストしました

これはうまくいきますが、これを試してみると:

glm::ivec2 pt = boost::lexical_cast<glm::ivec2>("1 1"); 

私は次のエラーを取得する:

/usr/include/boost/lexical_cast.hpp: In member function ‘bool boost::detail::lexical_stream_limited_src<CharT, Base, Traits>::operator>>(InputStreamable&) [with InputStreamable = glm::detail::tvec2<int>, CharT = char, Base = std::basic_streambuf<char>, Traits = std::char_traits<char>]’: 
/usr/include/boost/lexical_cast.hpp:1151:13: instantiated from ‘Target boost::detail::lexical_cast(typename boost::call_traits<B>::param_type, CharT*, std::size_t) [with Target = glm::detail::tvec2<int>, Source = const char*, bool Unlimited = false, CharT = char, typename boost::call_traits<B>::param_type = const char* const, std::size_t = long unsigned int]’ 
/usr/include/boost/lexical_cast.hpp:1174:77: instantiated from ‘Target boost::lexical_cast(const Source&) [with Target = glm::detail::tvec2<int>, Source = char [8]]’ 
test2.cpp:41:59: instantiated from here 
/usr/include/boost/lexical_cast.hpp:785:29: error: cannot bind ‘std::basic_istream<char>’ lvalue to ‘std::basic_istream<char>&&’ 
/usr/include/c++/4.6/istream:852:5: error: initializing argument 1 of ‘std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = glm::detail::tvec2<int>]’ 

EDIT: Boost.PropertyTreeのヘッダーが含まれている場合は、エラーが発生しただけらしいです。

答えて

1

答えは別によって発見されましたので、私はそれをここに残しておきます。

彼は、引数依存の検索について何かを述べ、ストリーム演算子はGLMに配置することが示唆::そうのような詳細namepace:その後

namespace glm { 
namespace detail { 

template <class T> 
std::ostream& operator<<(std::ostream& out, const glm::detail::tvec2<T>& vec) 
{ 
    out << vec.x << " " << vec.y; 
    return out; 
} 

template <class T> 
std::istream& operator>>(std::istream& in, glm::detail::tvec2<T>& vec) 
{ 
    in >> vec.x; 
    if (in.good() && in.ignore(256, ' ').good()) 
     in >> vec.y; 
    return in; 
} 

}} // glm::detail 

、すべてが正常に動作します。

1

あなたはこの抽出演算子投稿:

template <class T> 
std::istream& operator>>(std::istream& in, glm::detail::tvec2<T>& vec) 

をが、エラーが、これをコンパイルしようとしている意味:

std::istream& std::operator>>(std::istream&&, _Tp&) 
[with ... _Tp = glm::detail::tvec2<int>] 

あなたはあなたが投稿したコードは、あなたがコンパイルしているものと一致しますか? (すぐに見ることができない場合、演算子の最初の引数に注目してください)。


OKは、この完全なコードは私のために正常に動作します:

#include <sstream> 
#include <iostream> 

#include <boost/lexical_cast.hpp> 

template <class T> 
struct tvec2 { 
    tvec2() : x(), y() {} 
    tvec2(tvec2 const &) = default; 
    tvec2(T x_, T y_) : x(x_), y(y_) {} 

    T x; 
    T y; 
}; 

template <class T> 
std::ostream& operator<<(std::ostream& out, const tvec2<T>& vec) 
{ 
    out << vec.x << " " << vec.y; 
    return out; 
} 

template <class T> 
std::istream& operator>>(std::istream& in, tvec2<T>& vec) 
{ 
    // yuck, boost disables skipws on the input stream 
    in >> vec.x; 
    if (in.good() && in.ignore(256, ' ').good()) 
     in >> vec.y; 
    return in; 
} 

void test_operators() 
{ 
    tvec2<int> intvec(2,3); 
    std::cout << "intvec = {" << intvec << "}\n"; 

    std::stringstream ss; 
    ss << intvec; 

    tvec2<int> dupvec; 
    ss >> dupvec; 
    std::cout << "dupvec = {" << dupvec << "}\n"; 
} 

void test_lexical_cast() 
{ 
    std::cout << "and now with lexical_cast ...\n"; 
    tvec2<int> dupvec = boost::lexical_cast<tvec2<int> >("2 3"); 
    std::cout << "dupvec = {" << dupvec << "}\n"; 
} 

int main() 
{ 
    test_operators(); 
    test_lexical_cast(); 
} 
+0

はい、私が投稿したコードが私がコンパイルしようとしているものであることは絶対に確信しています。 –

+0

OK ... 'boost :: lexical_cast'の外で抽出(' '' ')演算子を使用している作業コードはありますか?挿入演算子のコードテストのみを表示します。 – Useless

+0

元の投稿に追加しました。 –

関連する問題