map中使用CArray提示错误: 没有可用的复制构造函数或复制构造函数声明为“explicit”

这个错误需要重写CArray类来解决, 原因是map赋值时需要使用含有参数的构造函数,并且要声明为const.

 

 

具体如下:

 

错误如何产生:

//定义一个CArray数组

CArray carrArr;

carrArr.Add(11);

std::map >  mapArr;

mapArr[1] = carrArr; //如果出现这行将会提示错误,    还有CArray没有"="操作符, 还需自己写

 

 

提示的错误:

d:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/utility(34) : error C2558: class“CArrayMy” : 没有可用的复制构造函数或复制构造函数声明为“explicit”
        with
        [
            TYPE=int,
            ARG_TYPE=int
        ]
        d:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/utility(32) : 编译类模板成员函数“std::pair<_Ty1,_Ty2>::pair(const int &,const _Ty2 &)”时
        with
        [
            _Ty1=const int,
            _Ty2=ArrInt
        ]
        d:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/map(146) : 参见对正在编译的类模板实例化“std::pair<_Ty1,_Ty2>”的引用
        with
        [
            _Ty1=const int,
            _Ty2=ArrInt
        ]
        d:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/map(142) : 编译类模板成员函数“std::map<_Kty,_Ty>::mapped_type &std::map<_Kty,_Ty>::operator [](const std::map<_Kty,_Ty>::key_type &)”时
        with
        [
            _Kty=int,
            _Ty=ArrInt
        ]
        d:/test/没有可用的复制构造函数或复制构造函数声明/aa/aadlg.cpp(184) : 参见对正在编译的类模板实例化“std::map<_Kty,_Ty>”的引用
        with
        [
            _Kty=int,
            _Ty=ArrInt
        ]

 

 

 

解决方法:

1. 重写CArray 为 CArrayMy, 如下:

 

#pragma once  //include "ArrayMy.h"
#include

template
class CArrayMy :
 public CArray //必须有这个
{
public:
 CArrayMy()//这个也需要重写, 否则默认构造函数将被下面的 代替, 或者说将找不到CArray中的  CArray()构造函数
 {
  m_pData = NULL;
  m_nSize = m_nMaxSize = m_nGrowBy = 0;
 }
 //***************************************************************
 //
 //CArrayMy(CArrayMy & arr)//如果这样定义, 将会提示"没有可用的复制构造函数或复制构造函数声明为“explicit”"
 //{
 // this->Copy(arr);
 //}
 CArrayMy(const CArrayMy & arr)//这样定义就不会了
 {
  this->Copy(arr);
 }
 //****************************************************************
 

 //map 赋值时也需要这个函数
 CArrayMy& operator=(CArrayMy & arr)
 {
  RemoveAll (); 
  for (INT_PTR i = 0;i < arr.GetSize();i ++)
  {
   Add (arr[i]);
  } 
  return (* this);
 }
 //CArrayMy& operator += (CArrayMy & arr)
 //{
 // for (INT_PTR i = 0;i < arr.GetSize ();i ++)
 // {
 //  Add(arr[i]);
 // }
 // return (* this);
 //}
};

 

2. 重写后, 使用重写的类CArrayMy代替CArray就可以了

 

CArrayMy carrArr;

carrArr.Add(11);

std::map >  mapArr;

mapArr[1] = carrArr; //如果出现这行将会提示错误,    还有CArray没有"="操作符, 还需自己写

 

 

 

//运行成功代码在我的空间资源中有 "没有可用的复制构造函数或复制构造函数声明"

 

你可能感兴趣的:(pair,.net,class,c)