3

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 *'
Community
  • 1
  • 1
Martin Ba
  • 37,187
  • 33
  • 183
  • 337

1 Answers1

0

Try replacing CString with CStringW, in case CString is mapped to CStringA.

What about exact error code, at which line in header? Can you try replacing the same error in local code?

Ajay
  • 18,086
  • 12
  • 59
  • 105
  • It was very definitely a UNICODE build, so `CStringW`. The full test code is in the question. (modulo a mostly empty `main`) – Martin Ba Oct 27 '13 at 20:14
  • What if you explicity typecast to LPCWSTR, or use GetString, or pass a non-const CString object? – Ajay Oct 28 '13 at 06:50