Preliminary note: string_algo works just fine with std::wstring
and of course I can (and do) convert the CString object(s) to std::wstring first if and when I need an algorithm from string_algo. It would be really nice though if I could just drop in the CString objects -- integration with existing code would be much easier!
What I want to do:
CString in = ...;
const CString out = boost::replace_last_copy(in, L"SEARCH", L"REPLACE");
As suggested here I tried to additionally include boost/range/mfc.hpp
to have Boost.Range adapted to MFC. (Although I don't quite get this header as looking at it it seems it doesn't do anything for CString, only for the collection classes.)
Boost 1.44.0 with Visual Studio 2005
Test code looks like this:
#include "stdafx.h"
#include <iostream>
#include <boost/range/mfc.hpp>
#include <boost/algorithm/string.hpp>
void f(CString const& input) {
CString out = boost::replace_last_copy(input, L"FROM", L"TO");
std::wcout << out << "\n";
}
The error I get looks like this:
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format_store.hpp(77) : error C2039: 'type' : is not a member of 'boost::range_const_iterator<C>'
1> with
1> [
1> C=const CString
1> ]
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(139) : see reference to function template instantiation 'bool boost::algorithm::detail::check_find_result<const InputT,const FindResultT>(InputT &,FindResultT &)' being compiled
1> with
1> [
1> InputT=CString,
1> FindResultT=boost::iterator_range<const wchar_t *>
1> ]
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\find_format.hpp(113) : see reference to function template instantiation 'InputT boost::algorithm::detail::find_format_copy_impl<SequenceT,FormatterT,boost::iterator_range<IteratorT>>(const InputT &,FormatterT,const FindResultT &)' being compiled
1> with
1> [
1> InputT=CString,
1> SequenceT=CString,
1> FormatterT=boost::algorithm::detail::const_formatF<boost::iterator_range<const wchar_t *>>,
1> IteratorT=const wchar_t *,
1> FindResultT=boost::iterator_range<const wchar_t *>
1> ]
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\replace.hpp(314) : see reference to function template instantiation 'SequenceT boost::algorithm::find_format_copy<SequenceT,boost::algorithm::detail::last_finderF<SearchIteratorT,PredicateT>,boost::algorithm::detail::const_formatF<RangeT>>(const SequenceT &,FinderT,FormatterT)' being compiled
1> with
1> [
1> SequenceT=CString,
1> SearchIteratorT=const wchar_t *,
1> PredicateT=boost::algorithm::is_equal,
1> RangeT=boost::iterator_range<const wchar_t *>,
1> FinderT=boost::algorithm::detail::last_finderF<const wchar_t *,boost::algorithm::is_equal>,
1> FormatterT=boost::algorithm::detail::const_formatF<boost::iterator_range<const wchar_t *>>
1> ]
1> ....\mytest.cpp(10) : see reference to function template instantiation 'SequenceT boost::algorithm::replace_last_copy<CString,const wchar_t[5],const wchar_t[3]>(const SequenceT &,Range1T (&),Range2T (&))' being compiled
1> with
1> [
1> SequenceT=CString,
1> Range1T=const wchar_t [5],
1> Range2T=const wchar_t [3]
1> ]
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format_store.hpp(78) : error C3203: 'type' : unspecialized class template can't be used as a template argument for template parameter 'IteratorT', expected a real type
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(121) : error C2780: 'void boost::algorithm::detail::insert(InputT &,InputT::iterator,const InsertT &)' : expects 3 arguments - 4 provided
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\sequence.hpp(39) : see declaration of 'boost::algorithm::detail::insert'
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(144) : see reference to function template instantiation 'InputT boost::algorithm::detail::find_format_copy_impl2<InputT,FormatterT,FindResultT,boost::iterator_range<IteratorT>>(const InputT &,FormatterT,const FindResultT &,const FormatResultT &)' being compiled
1> with
1> [
1> InputT=CString,
1> FormatterT=boost::algorithm::detail::const_formatF<boost::iterator_range<const wchar_t *>>,
1> FindResultT=boost::iterator_range<const wchar_t *>,
1> IteratorT=const wchar_t *,
1> FormatResultT=boost::iterator_range<const wchar_t *>
1> ]
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(121) : error C2893: Failed to specialize function template 'void boost::algorithm::detail::insert(InputT &,InputT::iterator,ForwardIteratorT,ForwardIteratorT)'
1> With the following template arguments:
1> 'CString'
1> 'const wchar_t *'
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(123) : error C2893: Failed to specialize function template 'void boost::algorithm::detail::insert(InputT &,InputT::iterator,const InsertT &)'
1> With the following template arguments:
1> 'CString'
1> 'boost::iterator_range<IteratorT>'
1> with
1> [
1> IteratorT=const wchar_t *
1> ]
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(123) : error C2780: 'void boost::algorithm::detail::insert(InputT &,InputT::iterator,ForwardIteratorT,ForwardIteratorT)' : expects 4 arguments - 3 provided
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\sequence.hpp(29) : see declaration of 'boost::algorithm::detail::insert'
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(125) : error C2780: 'void boost::algorithm::detail::insert(InputT &,InputT::iterator,const InsertT &)' : expects 3 arguments - 4 provided
1> c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\sequence.hpp(39) : see declaration of 'boost::algorithm::detail::insert'
1>c:\programme\boost_library-1_44_0\boost\algorithm\string\detail\find_format.hpp(125) : error C2893: Failed to specialize function template 'void boost::algorithm::detail::insert(InputT &,InputT::iterator,ForwardIteratorT,ForwardIteratorT)'
1> With the following template arguments:
1> 'CString'
1> 'const wchar_t *'