Collection Copy Policy in ATL8-vs2005
 
Collection Copy Policy in ATL8-vs2005
I need update my Collection from VC6 to vs2005
but has a error of Collection Copy Policy
IDL File
[
 object,
 uuid(47958973-CE5C-4E87-9F4E-40EEE01CD1AF),
 dual,
 nonextensible,
 helpstring("IObjA ????"),
 pointer_default(unique)
]
interface IObjA : IDispatch{
 [propget, id(1), helpstring("???? Objame")] HRESULT Objame([out, retval] 
BSTR* pVal);
};
[
 uuid(CF3AA015-4FB4-4708-A990-8566CDCB5B48),
 helpstring("IEnumCapturedImage Interface"),
 dual,
 pointer_default(unique),
 object
]
interface IEnumObjA : IUnknown
{
 typedef [unique] IEnumObjA *LPIEnumObjA;
 [local] HRESULT Next([in] ULONG celt, [out] IEnumObjA **rgelt, [out] ULONG 
*pceltFetched);
 [call_as(Next)] HRESULT RemoteNext([in] ULONG celt, [out, 
length_is(*pceltFetched), size_is(celt)] IEnumObjA **rgelt, [out] ULONG 
*pceltFetched);
 HRESULT Skip([in] ULONG celt);
 HRESULT Reset();
 HRESULT Clone([out] IEnumObjA **ppenum);
};
[
 object,
 uuid(260FB548-5B40-42BE-ADB2-88190111E022),
 dual,
 nonextensible,
 helpstring("IObjAs ????"),
 pointer_default(unique)
]
interface IObjAs : IDispatch{
 [propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval] 
IUnknown **ppUnk);
 [propget, id(DISPID_VALUE)] HRESULT Item([in] long Index, [out, retval] 
IObjA **pVal);
 [propget, id(1)] HRESULT Count([out, retval] long *pVal);
};
ObjAs.h
#include "CollTest1.h"
#include <map>
#include "ObjA.h"
typedef std::map<int, IObjA*> ObjAContainer;
template <class ContainerType, class InterfaceType>
class InterfaceCopy
{
public :
 typedef typename ContainerType::value_type SourceType;
 static void init(InterfaceType** p)
 {
  _CopyInterface<InterfaceType>::init(p);
 }
 static void destroy(InterfaceType** p)
 {
  _CopyInterface<InterfaceType>::destroy(p);
 }
 static HRESULT copy(InterfaceType** pTo, SourceType *pFrom )
 {
  return _CopyInterface<InterfaceType>::copy(pTo, &(pFrom->second));
 }
}; // class Interface Copy Policy
typedef InterfaceCopy<ObjAContainer, IObjA> InterfaceCopyPolicy;
typedef CComEnumOnSTL<IEnumObjA, &__uuidof(IEnumObjA), IObjA*, 
InterfaceCopyPolicy, ObjAContainer> ObjAEnumerator;
typedef ICollectionOnSTLImpl<IObjAs, ObjAContainer, IObjA*, 
InterfaceCopyPolicy, ObjAEnumerator> ObjACollection;
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && 
!defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE ????(???????????? DCOM ?????? Windows Mobile ????)???????????????????? COM ?????????? _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA ?????? ATL 
?????????????? COM ?????????????????????????? COM ??????????rgs ????????????????????????????Free???????????????????? DCOM Windows CE ????????????????????????"
#endif
// CObjAs
class ATL_NO_VTABLE CObjAs :
 public CComObjectRootEx<CComSingleThreadModel>,
 public CComCoClass<CObjAs, &CLSID_ObjAs>,
 public ISupportErrorInfo,
 public IDispatchImpl<ObjACollection, &IID_IObjAs, &LIBID_CollTest1Lib, 
/*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
 CObjAs()
 {
 }
DECLARE_REGISTRY_RESOURCEID(IDR_OBJAS)
BEGIN_COM_MAP(CObjAs)
 COM_INTERFACE_ENTRY(IObjAs)
 COM_INTERFACE_ENTRY(IDispatch)
 COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
// ISupportsErrorInfo
 STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
 DECLARE_PROTECT_FINAL_CONSTRUCT()
 HRESULT FinalConstruct()
 {
  return S_OK;
 }
 void FinalRelease()
 {
 }
public:
};
OBJECT_ENTRY_AUTO(__uuidof(ObjAs), CObjAs)
error C2664: 'InterfaceCopy<ContainerType,InterfaceType>::copy' : cannot 
convert parameter 2 from 'const std::pair<_Ty1,_Ty2> *__w64 ' to 
'std::pair<_Ty1,_Ty2> *'
If I modify code
....
template <class ContainerType, class InterfaceType>
class InterfaceCopy
{
....
....
 static HRESULT copy(InterfaceType** pTo, const SourceType *pFrom )
 {
  return _CopyInterface<InterfaceType>::copy(pTo, &(pFrom->second));
 }
}
....
....
error C2664: 'ATL::_CopyInterface<T>::copy' : cannot convert parameter 2 
from 'IObjA *const *__w64 ' to 'IObjA **'
Thanks in advance,
ZHP.Henry