taglib fails to compile with MS VC++ 2010

Lukáš Lalinský lalinsky at gmail.com
Fri Jan 21 17:19:13 CET 2011


2011/1/21 Tanguy Krotoff <tkrotoff at gmail.com>:
> ** Summary: yes this patch is perfect! it makes the code compliant
> with the new version C++0x (still to be released)

Thanks, I'd just like to confirm one more detail. Will the old version
not complain when it has to convert "unsigned long long" to "unsigned
long", i.e. something about losing precision?

Lukas

> ** More details:
>
> The error simplified is:
> mpegheader.cpp(172) : error C2668: 'std::bitset<_Bits>::bitset' :
> ambiguous call to overloaded function
> C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\bitset(136):
> could be 'std::bitset<_Bits>::bitset(_ULonglong)'
> C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\bitset(127):
> or 'std::bitset<_Bits>::bitset(int)'
> while trying to match the argument list '(TagLib::uint)'
>
> This is Visual C++ 2008 bitset constructor:
> http://msdn.microsoft.com/en-us/library/zfae7kt8(v=VS.90).aspx
> bitset(
>   unsigned long _Val
> );[...]
>
> This is Visual C++ 2010 bitset constructor:
> http://msdn.microsoft.com/en-us/library/zfae7kt8(v=VS.100).aspx
> bitset(
>   unsigned long long _Val
> );
>
> This is a change due to the new C++ version C++0x (still to be
> released...) cf bitset source code from Visual C++ 2010 on my hard
> drive (see http://www.codeguru.com/cpp/article.php/c18259 for more
> explanations about _HAS_CPP0X):
>
> [...]
>  #if _HAS_CPP0X
>        bitset(int _Ival)        <-------- line 127
>                {       // construct from bits in int
>                unsigned int _Val = (unsigned int)_Ival;
>                _Tidy();
>                for (size_t _Pos = 0; _Val != 0 && _Pos < _Bits; _Val >>= 1, ++_Pos)
>                        if (_Val & 1)
>                                set(_Pos);
>                }
>
>        bitset(_ULonglong _Val)       <-------- line 136
>
>  #else /* _HAS_CPP0X */
>        bitset(unsigned long _Val)
>  #endif /* _HAS_CPP0X */
> [...]
>
> More explanations about this change in C++0x :
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2795.html#694
> "[...]replace the bitset ctor that takes an unsigned long argument
> with one taking unsigned long long in the definition of the template"
>
>
>
> 2011/1/16 Lukáš Lalinský <lalinsky at gmail.com>:
>> On Fri, Jan 14, 2011 at 11:05 AM, Tanguy Krotoff <tkrotoff at gmail.com> wrote:
>>> Hi everybody.
>>>
>>> Any chance to get this patch on trunk?
>>
>> I'll commit it, but can somebody please explain to me why is it
>> necessary to cast the value to "unsigned long long". From what I can
>> see, the std::bitset class has only "unsigned long" constructor.
>> Shouldn't it be casted to "unsigned long" instead?
>>
>> Lukas


More information about the taglib-devel mailing list