[C++-sig] Re: def( str( self)) error

Jonathan Brandmeyer jbrandmeyer at earthlink.net
Mon May 26 23:21:27 CEST 2003


On Mon, 2003-05-26 at 16:08, David Abrahams wrote:

> From: David Abrahams <>
> Date: Mon, 26 May 2003 16:01:16 -0400
> Subject: [C++-sig] Re: def( str( self)) error
> Reply-To: c++-sig at python.org

> > I'm using G++ 3.2.2, with identical errors on Win32/MinGW and Debian
> > Sid.
> 
> Well, you're not allowed to add definitions to std:: - your function
> should go in namespace physics.  I'm not sure that would make a
> difference though; it seems it should be found by Koenig Lookup
> either way.

Done.

> Bug reporting and help requests 101: Why don't you post a small
> reproducible example, and at least give the full text of the error
> message?

Very well, here it is:
------ testme.cpp --------
#include <istream>
#include <ostream>
#include <boost/python.hpp>

namespace physics
{

class vector
{
public:
  double x, y, z;
};

template<typename char_T, class traits>
std::basic_ostream<char_T,traits>&
operator<<( std::basic_ostream<char_T,traits>& stream, const vector& v)
{
  std::basic_ostringstream<char_T,traits> s;
  s.copyfmt( stream);
  s.width( 0);

  s << "<" << v.x << "," << v.y << "," << v.z << ">";
  stream << s.str();

  return stream;
}

template< typename char_T, class traits>
std::basic_istream< char_T,traits>&
operator>>( std::basic_istream<char_T,traits>& stream, const vector& v)
{
  double x, y, z;
  char_T ch;

  stream >> ch;
  if (ch == '<') {
    stream >> x >> ch;
    if (ch == ',') {
      stream >> y >> ch;
      if (ch == ',') {
        stream >> z >> ch;
        v = vector( x, y, z);
      } else if (ch == '>') {
        v = vector( x, y);
      } else {
        stream.setstate( std::ios::failbit);
      }
    } else {
      stream.setstate( std::ios::failbit);
    }
  } else {
    stream.setstate( std::ios::failbit);
  }
  return stream;
}
} // !namespace physics

using namespace boost::python;

BOOST_PYTHON_MODULE(libphysics)
{
  class_< physics::vector>( "vector")
    .def( str( self))
    ;
}

compiled with:
$ g++-3.2 -c -o testme.lo -fpic -I/usr/include/python2.2 testme.cpp
testme.cpp: In function `void init_module_libphysics()':
testme.cpp:67: no matching function for call to `
   boost::python::class_<physics::vector,
boost::python::detail::not_specified,
   boost::python::detail::not_specified,
boost::python::detail::not_specified>
   ::def(boost::python::str)'








More information about the Cplusplus-sig mailing list