Boost logo

Boost Users :

From: Sean Rohead (sean.rohead_at_[hidden])
Date: 2005-11-11 11:30:25


I am using the Boost Unit Test library and have code that uses the
BOOST_CHECK_EQUAL macro with std::wstring instances. I get a
compilation error when I do this because there is no operator<< defined
for a narrow ostream and a wide string. So, I created one as shown
below, but I am still getting the exact same compilation error (using
MSVC 2003). With my new operators, I am able to manually insert wide
strings into a narrow ostream, but the BOOST_CHECK_EQUAL macro expansion
still doesn't seem to be picking it up. Any ideas?

Thanks,

Sean Rohead

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#include <string>
#include <iostream>

std::wstring widen(const std::string& source)
{
    std::wstring result(source.size(), wchar_t(0));
    typedef std::ctype<wchar_t> ctype_t;
    const ctype_t& ct = std::use_facet<ctype_t>(std::locale());
    ct.widen(source.data(), source.data() + source.size(),
&(*result.begin()));
    return result;
}

std::string narrow(std::wstring source)
{
    std::string result(source.size(), char(0));
    typedef std::ctype<wchar_t> ctype_t;
    const ctype_t& ct = std::use_facet<ctype_t>(std::locale());
    ct.narrow(source.data(), source.data() + source.size(), '\u00B6',
&(*result.begin()));
    return result;
}

std::ostream& operator<<(std::ostream& out, const std::wstring& value)
{
    out << narrow(value);
    return out;
}

std::wostream& operator<<(std::wostream& out, const std::string& value)
{
    out << widen(value);
    return out;
}

#include <boost/test/unit_test.hpp>

void main()
{
    std::string message("message");
    std::wstring wmessage(L"MESSAGE");

    // THESE TWO LINES COMPILE AND WORK FINE
    std::wcout << message << std::endl;
    std::cout << wmessage << std::endl;

    // THIS LINE STILL DOES NOT COMPILE
    BOOST_CHECK_EQUAL(wmessage, std::wstring(L"message"));
}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

------ Build started: Project: boost, Configuration: Debug Win32 ------

Compiling...
main.cpp
c:\lib\boost_1_32_0\boost\test\test_tools.hpp(207) : error C2679: binary
'<<' : no operator found which takes a right-hand operand of type 'const
std::wstring' (or there is no acceptable conversion)
        c:\lib\boost_1_32_0\boost\test\test_tools.hpp(206) : while
compiling class-template member function 'void
boost::test_tools::tt_detail::print_log_value<T>::operator
()(std::ostream &,const T &)'
        with
        [
            T=std::wstring
        ]
        c:\lib\boost_1_32_0\boost\test\test_tools.hpp(251) : see
reference to class template instantiation
'boost::test_tools::tt_detail::print_log_value<T>' being compiled
        with
        [
            T=std::wstring
        ]
        c:\lib\boost_1_32_0\boost\test\detail\wrap_stringstream.hpp(69)
: see reference to function template instantiation 'std::ostream
&boost::test_tools::tt_detail::operator <<<Left>(std::ostream &,const
boost::test_tools::tt_detail::print_helper<T> &)' being compiled
        with
        [
            Left=std::wstring,
            T=std::wstring
        ]
        c:\lib\boost_1_32_0\boost\test\test_tools.hpp(438) : see
reference to function template instantiation
'boost::basic_wrap_stringstream<CharT> &boost::operator
<<<char,boost::test_tools::tt_detail::print_helper<T>>(boost::basic_wrap
_stringstream<CharT> &,const
boost::test_tools::tt_detail::print_helper<T> &)' being compiled
        with
        [
            CharT=char,
            T=std::wstring
        ]
        c:\Documents and Settings\sean.rohead\My Documents\Visual Studio
Projects\boost\main.cpp(43) : see reference to function template
instantiation 'bool
boost::test_tools::tt_detail::equal_and_continue_impl<std::wstring,std::
basic_string<_Elem,_Traits,_Ax>>(const Left &,const Right
&,boost::wrap_stringstream
&,boost::test_tools::const_string,size_t,boost::unit_test::log_level,siz
e_t)' being compiled
        with
        [
            _Elem=wchar_t,
            _Traits=std::char_traits<wchar_t>,
            _Ax=std::allocator<wchar_t>,
            Left=std::wstring,
 
Right=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator
<wchar_t>>
        ]

Build log was saved at "file://c:\Documents and Settings\sean.rohead\My
Documents\Visual Studio Projects\boost\Debug\BuildLog.htm"
boost - 1 error(s), 0 warning(s)

---------------------- Done ----------------------

    Build: 0 succeeded, 1 failed, 0 skipped


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net