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.