map中使用CArray提示错误: 没有可用的复制构造函数或复制构造函数声明为“explicit”
2008-10-18 16:19
267 查看
这个错误需要重写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没有"="操作符, 还需自己写
//运行成功代码在我的空间资源中有 "没有可用的复制构造函数或复制构造函数声明"
具体如下:
错误如何产生:
//定义一个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没有"="操作符, 还需自己写
//运行成功代码在我的空间资源中有 "没有可用的复制构造函数或复制构造函数声明"
相关文章推荐
- 没有可用的复制构造函数或复制构造函数声明为“explicit” 问题解决
- 没有可用的复制构造函数或复制构造函数声明为“explicit”
- error C2558 没有可用的复制构造函数或复制构造函数声明为“explicit”
- 自定义类 作为item放入QList中 没有可用的复制构造函数或复制构造函数声明为“explicit”
- 没有可用的复制构造函数或复制构造函数声明为“explicit”
- 使用JS提交表单提示没有可用方法的错误
- C++中定义结构体对象提示没有合适的默认构造函数可用错误
- .NET错误提示之: (异常来自 HRESULT:0x80131040) 确认 <UsingTask> 声明是正确的,并且该程序集及其所有依赖项都可用
- VS调试出现错误提示 无法将“obj\Debug\*.*”复制到“bin\Debug\*.*”,文件正在由另一个进程使用,因此该进程无法访问此文件
- Windows 7安装MySQL最后一步提示错误“mysql 终结点映射器中没有更多的终结点可用的” 解决方法
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- vs2017使用libfdk-aac 链接提示没有“COMDAT 0xF”错误解决
- win7系统administrator用户提示没有管理员权限,造装驱动安装错误,软件无法使用
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- powerpoint 2010 打开ppt时才是提示错误,提示“Microsoft powerpoint 无法执行语言识别,此功能不可用。若要使用此功能 ,请再次运行安装程序,选择“添加或删除功能”,
- Win7 在C盘上复制粘贴文件的时候,提示错误0x80070522:客户端没有所需的特权
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- 【技术贴】安装MYSQL最后一步出现错误,提示"终结点映射器中没有更多的终结点可用的解决"!
- 在使用ajax接收返回map的时候,提示406错误
- mysql主主复制+keepalived高可用(使用VIP访问数据库提示不允许连接)