I think the problem is that Iterator and ConstIterator map to fundamentally different types that are not easily convertible due to differing template parameters to BasicIterator. The easiest solution may be to provide two copy and assignment methods for Basiciterator explicitly allowing each one. For example: