C++ 在C+中相等于来自不同类的两个对象+;

C++ 在C+中相等于来自不同类的两个对象+;,c++,C++,我的课程如下: //File Name: A.cpp class A{ struct L{ uint64_t r; std::vector < std::pair < std::pair < uint64_t, uint64_t> , std::vector <uint64_t> > > c; }; std::tr1::unordered_map< uint64_t ,L> m; }

我的课程如下:

//File Name: A.cpp
 class A{
   struct L{
       uint64_t r;
       std::vector < std::pair < std::pair < uint64_t, uint64_t> , std::vector <uint64_t> > > c;
   };
   std::tr1::unordered_map< uint64_t ,L> m;   
};

//File Name: B.cpp
class A;
class B{
   struct L{
       uint64_t r;
       std::vector < std::pair < std::pair < uint64_t, uint64_t >, std::vector <uint64_t > > > c;
   };
   std::tr1::unordered_map< uint64_t , L> m;
public:
   void equateMaps(std::tr1::unordered_map< uint64_t , L> m){
       this->m=m;
   }
};

//File main.cpp
main()
{
    B b; 
    A a
    b.equateMaps(a.m);
}
//文件名:A.cpp
甲级{
结构L{
uint64_t r;
std::vector,std::vector>>c;
};
std::tr1::无序地图m;
};
//文件名:B.cpp
甲级;
B类{
结构L{
uint64_t r;
std::vector,std::vector>>c;
};
std::tr1::无序地图m;
公众:
无效地图(标准::tr1::无序地图m){
这个->m=m;
}
};
//文件main.cpp
main()
{
B B;
A
b、 (a)上午;
}
但当我这样做时,我会得到以下错误:

error: no matching function for call to ‘b::equateMaps(std::tr1::unordered_map<long unsigned int, A::L>&)’
错误:调用“b::equalemaps(std::tr1::unordered_map&)”时没有匹配的函数
我无法理解为什么我会出现这个错误?有人能帮我找出哪里出了问题吗


我在Ubuntu中使用的是g++编译器

如果你真的想要将
struct L
变成相同的类型,你必须将它从类声明中移出,放在一个单独的头中,然后将它包含在两个类中:

// In a separate header
struct L{
       uint64_t r;
       std::vector < std::pair < std::pair < uint64_t, uint64_t> , std::vector <uint64_t> > > c;
};

// In header for A
#include "l.h"

class A {
    std::tr1::unordered_map< uint64_t ,L> m; 
};

// Similar for B...
//在单独的标题中
结构L{
uint64_t r;
std::vector,std::vector>>c;
};
//在标题中为
#包括“l.h”
甲级{
std::tr1::无序地图m;
};
//类似于B。。。

正如您目前看到的,
A::L
B::L
是完全不相关的类型,即使它们看起来是一样的。因此,相应的地图也属于不同的类型,无法进行比较。

您有两种不同的类型,
A::L
B::L
,以及两种不同的地图类型。您希望它如何工作?定义一个
L
类,并在
A
B
中使用它?这种行为是经过设计的。类最基本的用途之一是“包含”(即“具有”和“防止全局可见性”)名称。也就是说,类(附带一点)也是名称空间。A和B可以由不同的人在不同的时间在不同的地点开发。A的实现者可能不知道B。如果不同类中的名称是全局可见的,则很容易导致冲突,如果一个类中的定义会改变其他类中定义(或声明)的含义,则更糟糕,例如,类型L。这是一个完全不同的问题。只需在中使用一个引用,就像我上面展示的原型一样(函数参数声明中唯一的区别是“&”)。调用代码保持原样。当然,如果equale_map()修改传递的映射m,那么它将实际修改调用方的映射。如果那不是你想要的,你必须复制,不是吗?相反,如果它没有改变传递的映射,那么实际上应该显式地声明函数
void equalizemaps(const std::tr1::unordered_map&m)