[Bug libstdc++/12532] New: remove_if fails with Functor object
maierkom at rcs dot ei dot tum dot de
gcc-bugzilla@gcc.gnu.org
Tue Oct 7 12:14:00 GMT 2003
PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12532
Summary: remove_if fails with Functor object
Product: gcc
Version: 3.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: libstdc++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: maierkom at rcs dot ei dot tum dot de
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: sparc-sun-solaris2.8
GCC host triplet: sparc-sun-solaris2.8
GCC target triplet: sparc-sun-solaris2.8
The following code fails to compile in bits/stl_algo.h:1085 and 1017
The code compile fine with icc6 and icc7.
The problem occurs independend of host/target architecture (tested Linux,
Solars8, Solaris9) and across multiple gcc versions (3.2.3, 3.3, 3.3.1).
The error message:
/usr/local/gcc-3.3/include/c++/3.3.1/bits/stl_algo.h: In function `_OutputIter
std::remove_copy_if(_InputIter, _InputIter, _OutputIter, _Predicate) [with
_InputIter = std::_Rb_tree_iterator<std::string, const std::string&, const
std::string*>, _OutputIter = std::_Rb_tree_iterator<std::string, const
std::string&, const std::string*>, _Predicate = Inset<std::string>]':
/usr/local/gcc-3.3/include/c++/3.3.1/bits/stl_algo.h:1085: instantiated from
`_ForwardIter std::remove_if(_ForwardIter, _ForwardIter, _Predicate) [with
_ForwardIter = std::_Rb_tree_iterator<std::string, const std::string&, const
std::string*>, _Predicate = Inset<std::string>]'
bugtest.cc:30: instantiated from here
/usr/local/gcc-3.3/include/c++/3.3.1/bits/stl_algo.h:1017: error: passing `
const std::string' as `this' argument of `std::basic_string<_CharT, _Traits,
_Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const
std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits =
std::char_traits<char>, _Alloc = std::allocator<char>]' discards qualifiers
The code:
#include <algorithm>
#include <functional>
#include <iostream>
#include <set>
#include <string>
template <class X>
class Inset
{
public:
Inset(const std::set<X> &s)
: myset(s)
{ }
bool operator() (const X &x) const
{
return myset.find(x) != myset.end();
}
private:
const std::set<X> &myset;
};
/*
* this function should remove all elements of set b in set a
*/
void substract(std::set<std::string> &a, const std::set<std::string> &b)
{
a.erase(
remove_if(a.begin(),a.end(),Inset<std::string>(b)), // g++ doesn't like this line
a.end()
);
}
int main()
{
std::set<std::string> a,b;
a.insert("a");
a.insert("b");
a.insert("c");
a.insert("d");
a.insert("e");
a.insert("f");
b.insert("b");
b.insert("d");
b.insert("e");
substract(a,b);
for (std::set<std::string>::iterator i(a.begin()); i != a.end(); ++i)
std::cout << (*i) << "\n";
return 0;
}
More information about the Gcc-bugs
mailing list