Opened 11 years ago
Closed 11 years ago
#5793 closed Bugs (fixed)
[date_time] format_date_parser::parse_date does not compile with "Treat wchar_t as builtin type" set to No
| Reported by: | Owned by: | Antony Polukhin | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | lexical_cast |
| Version: | Boost 1.47.0 | Severity: | Problem |
| Keywords: | Cc: | antoshkka@… |
Description
Testing with Boost 1.47, though it reproduces with trunk as of 19/aug/2011.
Visual Studio 2008 / 2010; the following code does not compile when built with "treat wchar_t as builtin type=no" set in project settings:
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
void parseDate()
{
std::locale locale;
boost::date_time::format_date_parser<boost::gregorian::date, wchar_t> parser(L"", locale);
boost::date_time::special_values_parser<boost::gregorian::date, wchar_t> svp;
boost::gregorian::date date = parser.parse_date(L"", L"", svp);
}
The compile error is:
c:\source\boost\trunk\boost\lexical_cast.hpp(1406): error C2535: 'bool boost::detail::lexical_stream_limited_src<CharT,Traits,RequiresStringbuffer>::operator >>(unsigned short &)' : member function already defined or declared
with
[
CharT=char_type,
Traits=traits,
RequiresStringbuffer=false
]
c:\source\boost\trunk\boost\lexical_cast.hpp(1392) : see declaration of 'boost::detail::lexical_stream_limited_src<CharT,Traits,RequiresStringbuffer>::operator >>'
with
[
CharT=char_type,
Traits=traits,
RequiresStringbuffer=false
]
c:\source\boost\trunk\boost\lexical_cast.hpp(1687) : see reference to class template instantiation 'boost::detail::lexical_stream_limited_src<CharT,Traits,RequiresStringbuffer>' being compiled
with
[
CharT=char_type,
Traits=traits,
RequiresStringbuffer=false
]
c:\source\boost\trunk\boost\lexical_cast.hpp(1653) : while compiling class template member function 'short boost::detail::lexical_cast_do_cast<Target,Source>::lexical_cast_impl(const Source &)'
with
[
Target=short,
Source=src
]
c:\source\boost\trunk\boost\lexical_cast.hpp(1858) : see reference to class template instantiation 'boost::detail::lexical_cast_do_cast<Target,Source>' being compiled
with
[
Target=short,
Source=src
]
c:\source\boost\trunk\boost\date_time\format_date_parser.hpp(72) : see reference to function template instantiation 'Target boost::lexical_cast<int_type,std::basic_string<_Elem,_Traits,_Ax>>(const Source &)' being compiled
with
[
Target=short,
int_type=short,
_Elem=wchar_t,
_Traits=std::char_traits<wchar_t>,
_Ax=std::allocator<wchar_t>,
Source=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>
]
c:\source\boost\trunk\boost\date_time\format_date_parser.hpp(365) : see reference to function template instantiation 'int_type boost::date_time::fixed_string_to_int<short,charT>(std::istreambuf_iterator<_Elem,_Traits> &,std::istreambuf_iterator<_Elem,_Traits> &,boost::date_time::parse_match_result<charT> &,unsigned int,const charT &)' being compiled
with
[
int_type=short,
charT=wchar_t,
_Elem=wchar_t,
_Traits=std::char_traits<wchar_t>
]
c:\source\boost\trunk\boost\date_time\format_date_parser.hpp(254) : while compiling class template member function 'boost::gregorian::date boost::date_time::format_date_parser<date_type,charT>::parse_date(std::istreambuf_iterator<_Elem,_Traits> &,std::istreambuf_iterator<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Ax>,const boost::date_time::special_values_parser<date_type,charT> &) const'
with
[
date_type=boost::gregorian::date,
charT=wchar_t,
_Elem=wchar_t,
_Traits=std::char_traits<wchar_t>,
_Ax=std::allocator<wchar_t>
]
c:\source\dan\boost_wchar_t_test\boost_wchar_t_test\boost_wchar_t_test.cpp(9) : see reference to class template instantiation 'boost::date_time::format_date_parser<date_type,charT>' being compiled
with
[
date_type=boost::gregorian::date,
charT=wchar_t
]
If I set "Treat wchar_t as builtin type" to Yes, then it does compile correctly.
Change History (3)
comment:1 by , 11 years ago
| Component: | date_time → lexical_cast |
|---|---|
| Owner: | changed from to |
comment:2 by , 11 years ago
comment:3 by , 11 years ago
| Cc: | added |
|---|---|
| Resolution: | → fixed |
| Status: | new → closed |
Regression tests passed successfully.
Note:
See TracTickets
for help on using tickets.

Note to the submitter: You are deliberately configuring your compiler to not conform to the C++ standard which requires wchar_t to be a distinct type!
Anyway, I don't think this is a problem in the DateTime library but rather in the lexical_cast implementation. The simple line
triggers the fault for me. Class lexical_stream_limited_src is instantiated for wchar_t alias unsigned short. It defines an operator>> for both unsigned short and its CharT which then cause the conflict. The macro BOOST_NO_INTRINSIC_WCHAR_T could be used to detect this, but I'm not sure how to fix it without breaking other stuff on the way.