我正在使用Embarcadero C ++ Builder XE,Windows 7,32位。我有一个问题,使用类作为STL映射的类型来编译代码。 在我的简单测试示例中,类声明如下:
#include <map>
class TMyClass
{
private: // User declarations
int cVal1;
int cVal2;
public:
TMyClass& __fastcall operator = ( TMyClass& aMyClassObj);
public: // User declarations
__fastcall TMyClass( void);
__fastcall TMyClass( int aVal1, int aVal2);
__fastcall TMyClass( const TMyClass& aMyClassObj); // copy constructor 1
__fastcall TMyClass( TMyClass& aMyClassObj); // copy constructor 2
__fastcall ~TMyClass( );
};
该类用于地图:
typedef std::map< int, TMyClass> TMyMap;
我正在尝试将对象插入到地图中:
TMyMap sMyMap;
TMyClass sMyClassObj( 10, 10);
aMyMap[ 1] = sMyClassObj;
最后一行给出了编译错误:
[BCC32 Error] xtree(29): E2285 Could not find a match for 'pair<const int,TMyClass>::pair(const pair<const int,TMyClass>)'
Full parser context
xtree(28): decision to instantiate: _Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node::_Node(_Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node *,_Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node *,_Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node *,const pair<const int,TMyClass> &,char)
--- Resetting parser context for instantiation...
U_TestKompilacji.cpp(10): #include U_TestKompilacji.h
U_TestKompilacji.h(5): #include C:\Programms\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\map
map(20): #include C:\Programms\Embarcadero\RAD Studio\8.0\Quickrep505C\../include/dinkumware/map
map(5): #include c:\Programms\embarcadero\rad studio\8.0\include\dinkumware\xtree
xtree(8): namespace std
xtree(13): class _Tree_nod<_Traits>
xtree(25): class _Tree_nod<_Traits>::_Node
xtree(28): parsing: _Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node::_Node(_Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node *,_Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node *,_Tree_nod<_Tmap_traits<int,TMyClass,less<int>,allocator<pair<const int,TMyClass> >,0> >::_Node *,const pair<const int,TMyClass> &,char)
我一直试图找到解决方案很多天。我以前用过的Borland C ++ Builder 6.0中没有这样的问题。 是否有某种要求将类用作地图中的值?
答案 0 :(得分:0)
我可以看到一些小问题
默认构造函数应声明为TMyClass()
(不含void
)。这只是一个样式问题(函数声明的空括号/ void区别是针对C而不是C ++)。
为什么const
或TMyClass&
的复制构造函数不同?
为什么所有__fastcall
噪音?这是我删除的第一件事,看它是否有问题。
为了能够将一个元素放在一个map中作为该类必须可赋值的值,copy-constructible和default constructible(operator[]
需要能够默认构造一个元素)并且一切似乎都可以在这种情况下。
不幸的是,当您进入模板领域时,C ++编译器会产生几乎无用的错误消息。