This is strange ☹
By mistake, I removed the catch block from the example code. This was present in the original piece of code.
I am getting the compilation error with the new boost 1.82 and the VS2022 (v143 ) + C++17 is as follows at this line.
o << *boost::any_cast<T>(&a); //which was running with boost version 1.78 + VS2019 (v142) + C++14
Severity
Code
Description
Error
C2679
binary '<<': no operator found which takes a right-hand operand of type 'const ValueType' (or there is no acceptable conversion)
Best Regards,
Jyotideep (JD)
Confidential - Company Proprietary
From: Boost
Hi,
I was using VS2019, boost v1.78, and C++14 version and the below code was
working well. Same code gives build error with VS2022, boost v1.82, and
C++17 due to "o << *boost::any_cast<T>(&a);
" Instruction. I wanted to know why it behaves differently.
Your code compiles and works for me with VS2022 and C++17 (after adding a `catch` clause after the `try`, e.g. https://urldefense.proofpoint.com/v2/url?u=https-3A__godbolt.org_z_eWv9sjYzz&d=DwICAg&c=9mghv0deYPYDGP-W745IEdQLV1kHpn4XJRvR6xMRXtA&r=nKjmvhl-FVZt-1iD5Ea7mULt--dNphU4qGuhbCJsO90&m=phs2270IlMJnrkY8KPgf3575O_9O78a6bb347nW4R28oRm_nFrGGqsw3BpqiTWZ4&s=hynNTB7tJ605xXLfaD7lhvL1xAyZ7JlB7RRwzxtQq0I&e=.) What errors do you get?
Code :
class any_out
{
struct streamer
{
virtual void print(std::ostream& o, const boost::any& a) = 0;
virtual streamer* clone() = 0;
virtual ~streamer() {}
};
public:
any_out() : m_streamer(nullptr)
{
}
~any_out()
{
delete m_streamer;
}
template <typename T> any_out(const T& value)
: m_streamer(new streamer_imp<T>), m_object(value)
{
}
any_out(const any_out& a)
: m_streamer(a.m_streamer ? a.m_streamer->clone() : nullptr),
m_object(a.m_object)
{
}
template <typename T> any_out& operator=(const T& r)
{
any_out(r).swap(*this);
return *this;
}
any_out& operator=(const any_out& r)
{
any_out(r).swap(*this);
return *this;
}
any_out& swap(any_out& r) noexcept
{
std::swap(m_streamer, r.m_streamer);
std::swap(m_object, r.m_object);
return *this;
}
friend std::ostream& operator<<(std::ostream& o, const any_out& a)
{
if(a.m_streamer)
{
a.m_streamer->print(o, a.m_object);
}
return o;
}
boost::any& get() { return m_object; }
const boost::any get()const { return m_object; }
bool empty() const { return m_object.empty(); }
private:
template <typename T> struct streamer_imp : public streamer
{
virtual void print(std::ostream& o, const boost::any& a)
{
try {
if (a.empty()) {
o << "<empty>";
}
else {
o << *boost::any_cast<T>(&a);
}
}
}
virtual streamer* clone()
{
return new streamer_imp<T>();
}
};
// Members
streamer* m_streamer;
boost::any m_object;
};
I have migrated to VS2022, boost v1.82, and C++17, and due to a build error,
I have changed the code below.
virtual void print(std::ostream& o, const boost::any& a)
{
try {
if (a.empty()) {
o << "<empty>";
}
else {
o << boost::any_cast
(a);
}
}
}
any_out anyTest;
anyTest = 100;
std::string actualStr;
actualStr = make_string() << anyTest;
actualStr prints nullptr (0000000) instated of value 100 for VS2022, boost
v1.82 and C++17
Best Regards,
Jyotideep (JD)
Please be advised that this email may contain confidential information. If you
are not the intended recipient, please notify us by email by replying to the
sender and delete this message. The sender disclaims that the content of this
email constitutes an offer to enter into, or the acceptance of, any agreement;
provided that the foregoing does not invalidate the binding effect of any
digital or other electronic reproduction of a manual signature that is included
in any attachment.
Confidential - Company Proprietary
_______________________________________________
_______________________________________________ Unsubscribe & other changes: https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.boost.org_mailman_listinfo.cgi_boost&d=DwICAg&c=9mghv0deYPYDGP-W745IEdQLV1kHpn4XJRvR6xMRXtA&r=nKjmvhl-FVZt-1iD5Ea7mULt--dNphU4qGuhbCJsO90&m=phs2270IlMJnrkY8KPgf3575O_9O78a6bb347nW4R28oRm_nFrGGqsw3BpqiTWZ4&s=PmpOkIwy-jd3O0wS2fcKgI6GRM5c7a6g75F3Fo_jPhA&e= Please be advised that this email may contain confidential information. If you are not the intended recipient, please notify us by email by replying to the sender and delete this message. The sender disclaims that the content of this email constitutes an offer to enter into, or the acceptance of, any agreement; provided that the foregoing does not invalidate the binding effect of any digital or other electronic reproduction of a manual signature that is included in any attachment.