使用类作为STL映射的类型

时间:2014-03-24 11:40:25

标签: c++ map stl c++builder

我正在使用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中没有这样的问题。 是否有某种要求将类用作地图中的值?

1 个答案:

答案 0 :(得分:0)

我可以看到一些小问题

  1. 默认构造函数应声明为TMyClass()(不含void)。这只是一个样式问题(函数声明的空括号/ void区别是针对C而不是C ++)。

  2. 为什么constTMyClass&的复制构造函数不同?

  3. 为什么所有__fastcall噪音?这是我删除的第一件事,看它是否有问题。

  4. 为了能够将一个元素放在一个map中作为该类必须可赋值的值,copy-constructible和default constructible(operator[]需要能够默认构造一个元素)并且一切似乎都可以在这种情况下。

    不幸的是,当您进入模板领域时,C ++编译器会产生几乎无用的错误消息。