Untitled
unknown
c_cpp
4 months ago
24 kB
11
Indexable
#include <iostream> #include <vector> #include <chrono> template<typename T> struct MessageHeader final { public: T id{}; std::uint64_t size = 0; }; enum class MessageTypes : std::uint64_t { VectorMessage = 0 }; template<typename T> struct is_std_uint64_t_vector : std::is_same<std::vector<std::uint64_t>, std::decay_t<T>> {}; template<typename T> struct is_std_string : std::is_same<std::string, T> {}; template<typename T> struct Message final { public: MessageHeader<T> header{}; std::vector<std::uint8_t> body; template<typename DataType> friend Message<T>& operator <<(Message<T>& message, const DataType& data) { static_assert(std::is_standard_layout<DataType>::value || is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value, "Data is too complex to be pushed into vector."); std::uint64_t bodySize = message.body.size(); std::uint64_t resizedBodySize{ 0 }; if constexpr(is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value) { resizedBodySize = message.body.size() + data.size(); message.body.resize(resizedBodySize); std::copy_n(data.data(), data.size(), message.body.data() + bodySize); } else { resizedBodySize = message.body.size() + sizeof(DataType); message.body.resize(resizedBodySize); std::copy_n(& data, sizeof(DataType), message.body.data() + bodySize); } message.header.size = resizedBodySize; return message; } template<typename DataType> friend Message<T>& operator >>(Message<T>& message, DataType& data) { static_assert(std::is_standard_layout<DataType>::value || is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value, "Data is too complex to be pushed from vector."); std::uint64_t bodySize{ 0 }; if constexpr (is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value) { bodySize = message.body.size() - data.size(); std::copy_n(message.body.begin() + bodySize, data.size(), data.data()); } else { bodySize = message.body.size() - sizeof(DataType); std::copy_n(message.body.begin() + bodySize, bodySize, &data); } message.body.resize(bodySize); message.header.size = bodySize; return message; } }; int main() { Message<MessageTypes> message; std::chrono::system_clock::time_point timeNow = std::chrono::system_clock::now(); std::chrono::system_clock::time_point timeThen; message << timeNow; message >> timeThen; std::string str = "123"; std::uint64_t strSz = str.size(); std::uint64_t strCpySz{ 0 }; message << str << strSz; message >> strCpySz; std::string strCpy(strCpySz,'\0'); message >> strCpy; return 0; } 1>------ Build started: Project: MemcpyTests, Configuration: Debug x64 ------ 1>MemcpyTests.cpp 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: '=': cannot convert from 'const DataType' to '_Ty' 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: with 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: [ 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: DataType=std::chrono::system_clock::time_point 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: ] 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: and 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: [ 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: _Ty=uint8_t 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: ] 1>(compiling source file 'MemcpyTests.cpp') 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> the template instantiation context (the oldest one first) is 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(94,13): 1> see reference to function template instantiation 'Message<MessageTypes> &operator <<<std::chrono::system_clock::time_point>(Message<MessageTypes> &,const DataType &)' being compiled 1> with 1> [ 1> DataType=std::chrono::system_clock::time_point 1> ] 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(94,13): 1> see the first reference to 'operator <<' in 'main' 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(56,18): 1> see reference to function template instantiation '_OutIt std::copy_n<const DataType*,size_t,_Ty*>(_InIt,_Diff,_OutIt)' being compiled 1> with 1> [ 1> _OutIt=uint8_t *, 1> DataType=std::chrono::system_clock::time_point, 1> _Ty=uint8_t, 1> _InIt=const std::chrono::system_clock::time_point *, 1> _Diff=size_t 1> ] 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17): error C2679: binary '=': no operator found which takes a right-hand operand of type 'unsigned char' (or there is no acceptable conversion) 1>(compiling source file 'MemcpyTests.cpp') 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1): 1> could be 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)': cannot convert argument 2 from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Reason: cannot convert from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': no overloaded function could convert all the argument types 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1): 1> could be 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)': cannot convert argument 1 from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Reason: cannot convert from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Conversion requires a second user-defined-conversion operator or constructor 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)': cannot convert argument 1 from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Reason: cannot convert from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Conversion requires a second user-defined-conversion operator or constructor 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(210,9): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(void)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': function does not take 1 arguments 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(216,9): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<_Clock,_Duration2> &) noexcept(<expr>)' 1> with 1> [ 1> _Clock=std::chrono::system_clock 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> while trying to match the argument list '(unsigned char)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)': cannot convert argument 2 from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Reason: cannot convert from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': no overloaded function could convert all the argument types 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1): 1> could be 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)': cannot convert argument 1 from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Reason: cannot convert from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Conversion requires a second user-defined-conversion operator or constructor 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)': cannot convert argument 1 from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Reason: cannot convert from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> Conversion requires a second user-defined-conversion operator or constructor 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(210,9): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(void)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': function does not take 1 arguments 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(216,9): 1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<_Clock,_Duration2> &) noexcept(<expr>)' 1> with 1> [ 1> _Clock=std::chrono::system_clock 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> while trying to match the argument list '(unsigned char)' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17): 1> while trying to match the argument list '(DataType, unsigned char)' 1> with 1> [ 1> DataType=std::chrono::system_clock::time_point 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17): 1> the template instantiation context (the oldest one first) is 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(95,13): 1> see reference to function template instantiation 'Message<MessageTypes> &operator >><std::chrono::system_clock::time_point>(Message<MessageTypes> &,DataType &)' being compiled 1> with 1> [ 1> DataType=std::chrono::system_clock::time_point 1> ] 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(95,13): 1> see the first reference to 'operator >>' in 'main' 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(77,18): 1> see reference to function template instantiation '_OutIt std::copy_n<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>,uint64_t,DataType*>(_InIt,_Diff,_OutIt)' being compiled 1> with 1> [ 1> _OutIt=std::chrono::system_clock::time_point *, 1> _Ty=uint8_t, 1> DataType=std::chrono::system_clock::time_point, 1> _InIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<uint8_t>>>, 1> _Diff=uint64_t 1> ] 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: '=': conversion from 'const DataType' to '_Ty', possible loss of data 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: with 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: [ 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: DataType=uint64_t 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: ] 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: and 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: [ 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: _Ty=uint8_t 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: ] 1>(compiling source file 'MemcpyTests.cpp') 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): 1> the template instantiation context (the oldest one first) is 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(101,20): 1> see reference to function template instantiation 'Message<MessageTypes> &operator <<<uint64_t>(Message<MessageTypes> &,const DataType &)' being compiled 1> with 1> [ 1> DataType=uint64_t 1> ] 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(101,20): 1> see the first reference to 'operator <<' in 'main' 1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(56,18): 1> see reference to function template instantiation '_OutIt std::copy_n<const DataType*,size_t,_Ty*>(_InIt,_Diff,_OutIt)' being compiled 1> with 1> [ 1> _OutIt=uint8_t *, 1> DataType=uint64_t, 1> _Ty=uint8_t, 1> _InIt=const uint64_t *, 1> _Diff=size_t 1> ] 1>Done building project "MemcpyTests.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Editor is loading...
Leave a Comment