std::vector<boost::xpressive::sregex> fails to compile using gcc

F

flewpaul

Hi

I'm trying to use a vector of Boost Xpressive sregex objects. VS2005
compiles my code successfully, but gcc 3.4 and 4.1 fail with:

<path>/include/c++/3.4.5/bits/stl_construct.h: In function `void
std::__destroy_aux(_ForwardIterator, _ForwardIterator, __false_type)
[with _ForwardIterator = boost::xpressive::sregex*]':
<path>/include/c++/3.4.5/bits/stl_construct.h:152: instantiated from
`void std::_Destroy(_ForwardIterator, _ForwardIterator) [with
_ForwardIterator = boost::xpressive::sregex*]'
<path>/include/c++/3.4.5/bits/stl_vector.h:256: instantiated from
`std::vector<_Tp, _Alloc>::~vector() [with _Tp =
boost::xpressive::sregex, _Alloc =
std::allocator<boost::xpressive::sregex>]'
...\test.cpp:9: instantiated from here
<path>/include/c++/3.4.5/bits/stl_construct.h:120: error: no matching
function for call to `_Destroy(const
boost::proto::exprns_::expr<boost::proto::tag::address_of,
boost::proto::argsns_::list1<boost::xpressive::basic_regex<__gnu_cxx::__normal_iterator<const
char*, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > >&>, 1l>)'

The code to generate this is:

#include <vector>
#include <boost/xpressive/xpressive_dynamic.hpp>

using namespace std;
using namespace boost::xpressive;

int main(int argc, char* argv[])
{
vector<sregex> vec;
return 0;
}

Appreciate any feedback on solving this problem.

Rgds


Paul Flew
 
C

Christophe Bourez

I confirm the issue. By replacing the vector by a list, the example
compiles fine. I suggest you to ask your question directly on the
boost-users mailing list.

A priori, it seems to be a compiler bug.

Christophe
 
J

Jeff Flinn

Hi

I'm trying to use a vector of Boost Xpressive sregex objects. VS2005
compiles my code successfully, but gcc 3.4 and 4.1 fail with:

<path>/include/c++/3.4.5/bits/stl_construct.h: In function `void
std::__destroy_aux(_ForwardIterator, _ForwardIterator, __false_type)
[with _ForwardIterator = boost::xpressive::sregex*]':
<path>/include/c++/3.4.5/bits/stl_construct.h:152: instantiated from
`void std::_Destroy(_ForwardIterator, _ForwardIterator) [with
_ForwardIterator = boost::xpressive::sregex*]'
<path>/include/c++/3.4.5/bits/stl_vector.h:256: instantiated from
`std::vector<_Tp, _Alloc>::~vector() [with _Tp =
boost::xpressive::sregex, _Alloc =
std::allocator<boost::xpressive::sregex>]'
..\test.cpp:9: instantiated from here
<path>/include/c++/3.4.5/bits/stl_construct.h:120: error: no matching
function for call to `_Destroy(const
boost::proto::exprns_::expr<boost::proto::tag::address_of,
boost::proto::argsns_::list1<boost::xpressive::basic_regex<__gnu_cxx::__normal_iterator<const
char*, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > >&>, 1l>)'

The code to generate this is:

#include <vector>
#include <boost/xpressive/xpressive_dynamic.hpp>

using namespace std;
using namespace boost::xpressive;

int main(int argc, char* argv[])
{
vector<sregex> vec;
return 0;
}

My guess is that sregex is an incomplete type in this context, and IIRC,
std::vector requires complete type for instantiation. Did you mean to
include xpressive_dynamic.hpp? sregex probably is only forward declared
with this include. Did you mean to include xpressive_static.hpp?

Jeff
 
C

Christophe Bourez

I'm trying to use a vector of Boost Xpressive sregex objects. VS2005
compiles my code successfully, but gcc 3.4 and 4.1 fail with:
<path>/include/c++/3.4.5/bits/stl_construct.h: In function `void
std::__destroy_aux(_ForwardIterator, _ForwardIterator, __false_type)
[with _ForwardIterator = boost::xpressive::sregex*]':
<path>/include/c++/3.4.5/bits/stl_construct.h:152:   instantiated from
`void std::_Destroy(_ForwardIterator, _ForwardIterator) [with
_ForwardIterator = boost::xpressive::sregex*]'
<path>/include/c++/3.4.5/bits/stl_vector.h:256:   instantiated from
`std::vector<_Tp, _Alloc>::~vector() [with _Tp =
boost::xpressive::sregex, _Alloc =
std::allocator<boost::xpressive::sregex>]'
..\test.cpp:9:   instantiated from here
<path>/include/c++/3.4.5/bits/stl_construct.h:120: error: no matching
function for call to `_Destroy(const
boost::proto::exprns_::expr<boost::proto::tag::address_of,
boost::proto::argsns_::list1<boost::xpressive::basic_regex<__gnu_cxx::__normal_iterator<const
char*, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > >&>, 1l>)'
The code to generate this is:
#include <vector>
#include <boost/xpressive/xpressive_dynamic.hpp>
using namespace std;
using namespace boost::xpressive;
int main(int argc, char* argv[])
{
       vector<sregex> vec;
       return 0;
}

My guess is that sregex is an incomplete type in this context, and IIRC,
std::vector requires complete type for instantiation. Did you mean to
include xpressive_dynamic.hpp? sregex probably is only forward declared
with this include. Did you mean to include xpressive_static.hpp?

Jeff

Hi Jeff,

In my test, I did
#include <boost/xpressive/xpressive.hpp> which includes both dynamic
and static.

Christophe
 
F

flewpaul

Hi
I'm trying to use a vector of Boost Xpressive sregex objects. VS2005
compiles my code successfully, but gcc 3.4 and 4.1 fail with:
<path>/include/c++/3.4.5/bits/stl_construct.h: In function `void
std::__destroy_aux(_ForwardIterator, _ForwardIterator, __false_type)
[with _ForwardIterator = boost::xpressive::sregex*]':
<path>/include/c++/3.4.5/bits/stl_construct.h:152:   instantiated from
`void std::_Destroy(_ForwardIterator, _ForwardIterator) [with
_ForwardIterator = boost::xpressive::sregex*]'
<path>/include/c++/3.4.5/bits/stl_vector.h:256:   instantiated from
`std::vector<_Tp, _Alloc>::~vector() [with _Tp =
boost::xpressive::sregex, _Alloc =
std::allocator<boost::xpressive::sregex>]'
..\test.cpp:9:   instantiated from here
<path>/include/c++/3.4.5/bits/stl_construct.h:120: error: no matching
function for call to `_Destroy(const
boost::proto::exprns_::expr<boost::proto::tag::address_of,
boost::proto::argsns_::list1<boost::xpressive::basic_regex<__gnu_cxx::__normal_iterator<const
char*, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > >&>, 1l>)'
The code to generate this is:
#include <vector>
#include <boost/xpressive/xpressive_dynamic.hpp>
using namespace std;
using namespace boost::xpressive;
int main(int argc, char* argv[])
{
       vector<sregex> vec;
       return 0;
}
My guess is that sregex is an incomplete type in this context, and IIRC,
std::vector requires complete type for instantiation. Did you mean to
include xpressive_dynamic.hpp? sregex probably is only forward declared
with this include. Did you mean to include xpressive_static.hpp?

Hi Jeff,

In my test, I did
#include <boost/xpressive/xpressive.hpp> which includes both dynamic
and static.

Christophe

Thanks for the responses. I'll look at my code to see whether a list<>
will offer the performance I need in this case. I did cross-post to
gnu.g++.bug but haven't got any response - I'll post on the Boost list
aswell.

Many Thanks



Paul
 
F

flewpaul

(e-mail address removed) wrote:
Hi
I'm trying to use a vector of Boost Xpressive sregex objects. VS2005
compiles my code successfully, but gcc 3.4 and 4.1 fail with:
<path>/include/c++/3.4.5/bits/stl_construct.h: In function `void
std::__destroy_aux(_ForwardIterator, _ForwardIterator, __false_type)
[with _ForwardIterator = boost::xpressive::sregex*]':
<path>/include/c++/3.4.5/bits/stl_construct.h:152:   instantiated from
`void std::_Destroy(_ForwardIterator, _ForwardIterator) [with
_ForwardIterator = boost::xpressive::sregex*]'
<path>/include/c++/3.4.5/bits/stl_vector.h:256:   instantiated from
`std::vector<_Tp, _Alloc>::~vector() [with _Tp =
boost::xpressive::sregex, _Alloc =
std::allocator<boost::xpressive::sregex>]'
..\test.cpp:9:   instantiated from here
<path>/include/c++/3.4.5/bits/stl_construct.h:120: error: no matching
function for call to `_Destroy(const
boost::proto::exprns_::expr<boost::proto::tag::address_of,
boost::proto::argsns_::list1<boost::xpressive::basic_regex<__gnu_cxx::__normal_iterator<const
char*, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > >&>, 1l>)'
The code to generate this is:
#include <vector>
#include <boost/xpressive/xpressive_dynamic.hpp>
using namespace std;
using namespace boost::xpressive;
int main(int argc, char* argv[])
{
       vector<sregex> vec;
       return 0;
}
My guess is that sregex is an incomplete type in this context, and IIRC,
std::vector requires complete type for instantiation. Did you mean to
include xpressive_dynamic.hpp? sregex probably is only forward declared
with this include. Did you mean to include xpressive_static.hpp?
Jeff
In my test, I did
#include <boost/xpressive/xpressive.hpp> which includes both dynamic
and static.
Christophe

Thanks for the responses. I'll look at my code to see whether a list<>
will offer the performance I need in this case. I did cross-post to
gnu.g++.bug but haven't got any response - I'll post on the Boost list
aswell.

Many Thanks

Paul

Posted on Boost bug list, turns out it has already been reported and
fixed for Boost 1.42 (https://svn.boost.org/trac/boost/ticket/3712)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top