Boost logo

Boost Users :

Subject: [Boost-users] [Optional] Possible bug with VS2008
From: dariomt_at_[hidden]
Date: 2014-11-05 05:47:44


Hi,

The following minimal test case does not compile with VS2008 (using Boost
1.55)

#include <boost/optional.hpp>
struct A
{
    int T;
};
int main()
{
    boost::optional<A> a;
}

The error is, edited for clarity:
boost\optional\optional.hpp(479) : error C2523: 'A::~T' : destructor tag
mismatch
boost\optional\optional.hpp(479) : while compiling class template member
function 'void
boost::optional_detail::optional_base<T>::destroy_impl(boost::optional_detail::optional_base<T>::is_not_reference_tag)'
with
[
    T=A
]
boost\optional\optional.hpp(500) : see reference to class template
instantiation 'boost::optional_detail::optional_base<T>' being compiled
with
[
    T=A
]
main.cpp(8) : see reference to class template instantiation
'boost::optional<T>' being compiled
with
[
    T=A
]

After much head-scratching, I found out the culprit: the name of the
integer member!! The compiler confuses the name of member 'T' with the name
of the template parameter 'T' when trying to invoke its destructor...

The offending code is
void destroy_impl ( is_not_reference_tag ) { get_ptr_impl()->T::~T() ;
m_initialized = false ; }

Given that I cannot change struct A, is there a way to fix this?
Is this a compiler bug or a Boost.Optional bug?

Thanks in advance!



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net