[gcc 2.9.x] Konwersja string na bitset

0

Mam taki oto kod.Kompilowałem go pod linuxem używając g++.

#include<bitset>
#include<iostream>
#include<string>

using namespace std;

int main()
{
	string cbits("111011010110111");
	cout << "jako ciag znakowy=" << cbits <<endl;
	cout << bitset<32>(cbits) << "[bitset<32>(cbits)]" << endl;
}

Wywala nastepujacy błąd:

/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/bitset: In method void bitset<32,long unsigned int>::_M_copy_from_string<char, string_char_traits<char>, __default_alloc_template<true,0> >(const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > &, unsigned int, unsigned int)': /usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/bitset:637: instantiated from here /usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/bitset:832: min' undeclared (first use this function)
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/bitset (Each undeclared identifier is reported only once
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/bitset for each function it appears in.)

Oto interesujace fragmenty pliku bitset:

// 23.3.5.1 constructors:
  bitset() {}
  bitset(unsigned long __val) :
    _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT>(__val) {}

  template<class _CharT, class _Traits, class _Alloc>
  explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s,
                  size_t __pos = 0,
                  size_t __n = size_t(basic_string<_CharT,_Traits,_Alloc>::npos))
    : _Base()
  {
    if (__pos > __s.size())
      __STL_THROW(out_of_range("bitset"));
    _M_copy_from_string(__s, __pos, __n);  //tu nastepuje wylot linia 637
  }

Definicja szablonu _M_copy_from_string:

template <size_t _Nb, class _WordT>
template<class _CharT, class _Traits, class _Alloc>
void bitset<_Nb, _WordT>
  ::_M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
                        size_t __pos,
                        size_t __n)
{
  reset();
  const size_t __nbits = min(_Nb, min(__n, __s.size() - __pos));//tu nastepuje wylot  linia 832
  for (size_t __i = 0; __i < __nbits; ++__i) {
    switch(__s[__pos + __nbits - __i - 1]) {
    case '0':
      break;
    case '1':
      set(__i);
      break;
    default:
      __STL_THROW(invalid_argument("bitset"));
    }
  }
}

Typ string jest zdefiniowany jako:

typedef basic_string<char>  string

Wniosek:
Wylot nastepuje z powodu niezdefiniowanej funkcji min().
Okazało sie ,że jest ona zdefiniowana w nagłówku:
<algorithm>

Tymczasem <bitset> go nie dołancza:

Gdy dołonczymy go sami:

#include<bitset>
#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int main()
{
	string cbits("111011010110111");
	cout << "jako ciag znakowy=" << cbits <<endl;
	cout << bitset<32>(cbits) << "[bitset<32>(cbits)]" << endl;
}

To wszystko się kompiluje i otrzymujemy na wyjsciu:

jako ciag znakowy=111011010110111
00000000000000000111011010110111[bitset<32>(cbits)]

Moim skromnym zdaniem ten kod powinien się kompilować bez dolanczania nagłówka <algorithm> i to jest jakiś bug. Chciałem zapytać czy na innych kompilatorach: Builder,VC++,Dev ten kod bez tej poprawki wam się kompiluje.

Pozdro i dzięki za wszelkie odpowiedzi.

0

bc++ ok

0

dzięki :)

0

MinGW 3.4.2 - kompiluje się bez algorithm

dopisane:
widzę, że masz muzealnego gcc 2.9x - uaktualnij sobie cholerę do wersji 3.x.x, bo wersje 2.9.x to w ogóle jaja robiły czasem nieziemskie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1