
Well, it seems I've answered my own question. The similarity of the interface to std::basic_string led me to believe that what I was attempting was possible. But the fundamental difference is that basic_string _is_ a container of characters (the type returned when its iterators are dereferenced), but basic_path only _pretends to be_ a container of path elements (strings) which is what is returned when its iterators are dereferenced. Might I humbly suggest something along the lines of the following? template<class String, class Traits> basic_path<String, Traits> & basic_path<String, Traits>::append( iterator first, iterator last ) { assert( first.m_path_ptr == last.m_path_ptr ); m_path.append( first.m_path_ptr->m_path.begin() + first.m_pos, last.m_path_ptr->m_path.begin() + last.m_pos ); return *this; } Declared in the class thus: class iterator; basic_path & append( iterator first, iterator last );