pcg-cpp icon indicating copy to clipboard operation
pcg-cpp copied to clipboard

pcg64 stream operator visual studio compilation error C2678: binary '|': no operator found

Open jschueller opened this issue 4 months ago • 1 comments

using pcg64 stream operator make compilation fail with visual studio 2022 (pcg32 is ok though):

D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31): error C2678: binary '|': no operator found which takes a left-hand operand of type 'pcg_extras::uint_x4<uint32_t,uint64_t>' (or there is no acceptable conversion) [D:\a\pcg-cpp\pcg-cpp\cppref.vcxproj]
  (compiling source file 'sample/cppref-sample.cpp')
      D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
      could be 'built-in C++ operator|(UIntX2, int)'

here is the minimal code to reproduce:

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
#include <sstream>

#include "pcg_random.hpp"
 
int main()
{
    // Make a random number engine 
    pcg64 rng(0);

    // save state
    std::stringstream stream;
    stream << rng;
    
    std::cout << "state="<<stream.str()<<std::endl;

    //reload stream
    stream >> rng;
}

here is the complete compiler output:

D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31): error C2678: binary '|': no operator found which takes a left-hand operand of type 'pcg_extras::uint_x4<uint32_t,uint64_t>' (or there is no acceptable conversion) [D:\a\pcg-cpp\pcg-cpp\cppref.vcxproj]
  (compiling source file 'sample/cppref-sample.cpp')
      D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
      could be 'built-in C++ operator|(UIntX2, int)'
          with
          [
              UIntX2=uint64_t
          ]
          D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
          '|': cannot convert argument 1 from 'pcg_extras::uint_x4<uint32_t,uint64_t>' to 'UIntX2'
          with
          [
              UIntX2=uint64_t
          ]
      D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
      or       'built-in C++ operator|(bool, int)'
          D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
          '|': cannot convert argument 1 from 'pcg_extras::uint_x4<uint32_t,uint64_t>' to 'bool'
      D:\a\pcg-cpp\pcg-cpp\include\pcg_uint128.hpp(837,22):
      or       'pcg_extras::uint_x4<UInt,UIntX2> pcg_extras::operator |(const pcg_extras::uint_x4<UInt,UIntX2> &,const pcg_extras::uint_x4<UInt,UIntX2> &)'
          D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
          'pcg_extras::uint_x4<UInt,UIntX2> pcg_extras::operator |(const pcg_extras::uint_x4<UInt,UIntX2> &,const pcg_extras::uint_x4<UInt,UIntX2> &)': could not deduce template argument for 'const pcg_extras::uint_x4<UInt,UIntX2> &' from 'int'
      D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
      while trying to match the argument list '(pcg_extras::uint_x4<uint32_t,uint64_t>, int)'
      D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(336,31):
      the template instantiation context (the oldest one first) is
          D:\a\pcg-cpp\pcg-cpp\sample\cppref-sample.cpp(49,11):
          see reference to class template instantiation 'pcg_detail::engine<uint64_t,pcg_extras::pcg128_t,pcg_detail::xsl_rr_mixin<uint64_t,pcg_extras::pcg128_t>,false,pcg_detail::specific_stream<pcg_extras::pcg128_t>,pcg_detail::default_multiplier<pcg_extras::pcg128_t>>' being compiled
          D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(379,23):
          see reference to class template instantiation 'pcg_detail::specific_stream<pcg_extras::pcg128_t>' being compiled
          D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(334,10):
          while compiling class template member function 'void pcg_detail::specific_stream<pcg_extras::pcg128_t>::set_stream(itype)'
          with
          [
              itype=pcg_extras::pcg128_t
          ]
              D:\a\pcg-cpp\pcg-cpp\include\pcg_random.hpp(624,26):
              see the first reference to 'pcg_detail::specific_stream<pcg_extras::pcg128_t>::set_stream' in 'pcg_detail::operator >>'

jschueller avatar Oct 07 '24 20:10 jschueller