map中使用CArray提示錯誤: 沒有可用的複製構造函數或複製構造函數聲明爲“explicit”

這個錯誤需要重寫CArray類來解決, 原因是map賦值時需要使用含有參數的構造函數,並且要聲明爲const.

 

 

具體如下:

 

錯誤如何產生:

//定義一個CArray數組

CArray<int,int> carrArr;

carrArr.Add(11);

std::map<int, CArray<int,int> >  mapArr;

mapArr[1] = carrArr; //如果出現這行將會提示錯誤,    還有CArray沒有"="操作符, 還需自己寫

 

 

提示的錯誤:

d:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/utility(34) : error C2558: class“CArrayMy<TYPE,ARG_TYPE>” : 沒有可用的複製構造函數或複製構造函數聲明爲“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 <afxtempl.h>

template<class TYPE, class ARG_TYPE = const TYPE&>
class CArrayMy :
 public CArray <TYPE, ARG_TYPE> //必須有這個<TYPE, ARG_TYPE>
{
public:
 CArrayMy()//這個也需要重寫, 否則默認構造函數將被下面的 代替, 或者說將找不到CArray中的  CArray()構造函數
 {
  m_pData = NULL;
  m_nSize = m_nMaxSize = m_nGrowBy = 0;
 }
 //***************************************************************
 //
 //CArrayMy(CArrayMy <TYPE, ARG_TYPE> & arr)//如果這樣定義, 將會提示"沒有可用的複製構造函數或複製構造函數聲明爲“explicit”"
 //{
 // this->Copy(arr);
 //}
 CArrayMy(const CArrayMy <TYPE, ARG_TYPE> & arr)//這樣定義就不會了
 {
  this->Copy(arr);
 }
 //****************************************************************
 

 //map 賦值時也需要這個函數
 CArrayMy<TYPE, ARG_TYPE>& operator=(CArrayMy <TYPE, ARG_TYPE> & arr)
 {
  RemoveAll (); 
  for (INT_PTR i = 0;i < arr.GetSize();i ++)
  {
   Add (arr[i]);
  } 
  return (* this);
 }
 //CArrayMy<TYPE, ARG_TYPE>& operator += (CArrayMy <TYPE, ARG_TYPE> & arr)
 //{
 // for (INT_PTR i = 0;i < arr.GetSize ();i ++)
 // {
 //  Add(arr[i]);
 // }
 // return (* this);
 //}
};

 

2. 重寫後, 使用重寫的類CArrayMy代替CArray就可以了

 

CArrayMy<int,int> carrArr;

carrArr.Add(11);

std::map<int, CArrayMy<int,int> >  mapArr;

mapArr[1] = carrArr; //如果出現這行將會提示錯誤,    還有CArray沒有"="操作符, 還需自己寫

 

 

 

//運行成功代碼在我的空間資源中有 "沒有可用的複製構造函數或複製構造函數聲明"

 

發佈了30 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章