[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