Ticket #5146: variant_bug.cpp

File variant_bug.cpp, 2.0 KB (added by Florian Goujeon <flo.goujeon@…>, 12 years ago)
Line 
1#include <boost/variant.hpp>
2using namespace boost;
3
4
5
6class ptr_to_test_variant;
7
8typedef
9 variant
10 <
11 int,
12 ptr_to_test_variant
13 >
14 test_variant
15;
16
17class ptr_to_test_variant
18{
19 public:
20 explicit
21 ptr_to_test_variant(const test_variant& pointed_test_variant);
22
23 ptr_to_test_variant(const ptr_to_test_variant& rhs);
24
25 ~ptr_to_test_variant();
26
27 ptr_to_test_variant&
28 operator=(const ptr_to_test_variant& rhs);
29
30 const test_variant&
31 pointed_test_variant() const;
32
33 private:
34 test_variant* pointed_test_variant_;
35};
36
37bool
38operator==(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs);
39
40bool
41operator!=(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs);
42
43
44
45ptr_to_test_variant::ptr_to_test_variant(const test_variant& pointed_test_variant):
46 pointed_test_variant_(new test_variant(pointed_test_variant))
47{
48}
49
50ptr_to_test_variant::ptr_to_test_variant(const ptr_to_test_variant& rhs):
51 pointed_test_variant_(new test_variant(*rhs.pointed_test_variant_))
52{
53}
54
55ptr_to_test_variant::~ptr_to_test_variant()
56{
57 delete pointed_test_variant_;
58}
59
60ptr_to_test_variant&
61ptr_to_test_variant::operator=(const ptr_to_test_variant& rhs)
62{
63 delete pointed_test_variant_; //no more assertion failure if one comments this line
64 pointed_test_variant_ = new test_variant(*rhs.pointed_test_variant_);
65 return *this;
66}
67
68const test_variant&
69ptr_to_test_variant::pointed_test_variant() const
70{
71 return *pointed_test_variant_;
72}
73
74bool
75operator==(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs)
76{
77 return
78 lhs.pointed_test_variant() == rhs.pointed_test_variant()
79 ;
80}
81
82bool
83operator!=(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs)
84{
85 return !operator==(lhs, rhs);
86}
87
88
89
90int main()
91{
92 test_variant tv1 = 88;
93 test_variant ptr_to_tv1 = ptr_to_test_variant(tv1);
94 test_variant ptr_to_ptr_to_tv1 = ptr_to_test_variant(ptr_to_tv1);
95
96 const ptr_to_test_variant& direct_ptr_to_ptr_to_tv1 = get<ptr_to_test_variant>(ptr_to_ptr_to_tv1);
97 ptr_to_ptr_to_tv1 = direct_ptr_to_ptr_to_tv1.pointed_test_variant();
98}
99