From: Ian S. <ian...@st...> - 2002-11-11 11:58:35
|
Short version: MSVC7.0 appears to contradict itself over the type of ptrdiff_t. If I pretend that ptrdiff_t is a standard type - int - it warns me that I might lose information when I convert it for an ostensible 64 bit number to a 32bit int. If I provide functions which depend on ptrdiff_t not being a standard type it complains that ptrdiff_t is int and I have already declared an overloaded function for int. Does anyone know what is going on Ian. Long version: I have added some IO functions for vcl_ptrdiff_t and vcl_size_t. These are #ifdef'ed out for most platforms because they are typedef'ed to int and unsigned int respectively for which perfectly good functions already exist. The reason they were added was http://www.cs.rpi.edu/research/vision/vxl/Testing/Sites/cs.rpi.edu/Win32-Dot NET-devenv/20021108-0300-Nightly/BuildWarning.html#8715 vimt_image_2d_of+double-.cxx C:\cygwin\home\dashboard\vxl_src_nightly\mul\vil2\io\vil2_io_image_view.h(30 ) : warning C4244: 'argument' : conversion from 'ptrdiff_t' to 'int', possible loss of data C:\cygwin\home\dashboard\vxl_src_nightly\mul\vimt\vimt_image_2d_of.txx(98) : see reference to function template instantiation 'void vsl_b_write(vsl_b_ostream &,const vil2_image_view<T> &)' being compiled This warning tells me that MSVC7.0 defines ptrdiff_t to not be int. You get a similar warning if you try to convert it to long. In other places, e.g. http://www.cs.rpi.edu/research/vision/vxl/Testing/Sites/cs.rpi.edu/Win32-Dot NET-devenv/20021109-0300-Nightly/BuildWarning.html#121659 C:\cygwin\home\dashboard\vxl_src_nightly\mul\vil2\vil2_vil1.h(34) : warning C4244: 'argument' : conversion from '__w64 int' to 'int', possible loss of data C:\cygwin\home\dashboard\vxl_src_nightly\mul\vil2\vil2_vil1.h(34) : warning C4244: 'argument' : conversion from '__w64 int' to 'int', possible loss of data you can see that MSVC7.0 appears to define a pointer difference to be __w64 int, an implementation defined type. With this in mind, and wanting to correctly generalise vil2, I wrote some IO functions for this specialised type. #ifdef VCL_VC70 // When the macro is ready, this test will be // #if ! VCL_PTRDIFF_T_IS_A_STANDARD_TYPE //: Write to vsl_b_ostream void vsl_b_write(vsl_b_ostream& os,vcl_ptrdiff_t n ); //: Read from vsl_b_istream void vsl_b_read(vsl_b_istream& is,vcl_ptrdiff_t & n ); //: Print to a stream inline void vsl_print_summary(vcl_ostream& os, vcl_ptrdiff_t n ) { os << n; } #endif However, MSVC7.0 has freaked out over this http://www.cs.rpi.edu/research/vision/vxl/Testing/Sites/cs.rpi.edu/Win32-Dot NET-devenv/20021111-0300-Nightly/BuildError.html#521 complaining that vsl_binary_io.cxx c:\cygwin\home\dashboard\vxl_src_nightly\vxl\vsl\vsl_binary_io.h(349) : error C2084: function 'void vsl_print_summary(std::ostream &,int)' already has a body for the third last line above. So I'm confused. If I pretend that ptrdiff_t is a standard type - int - it warns me that I might lose information. If I provide functions which depend on ptrdiff_t not being a standard type it complains that ptrdiff_t is int and I have already declared an overloaded function for int. Any suggestions for a way out of this mess. |