为什么在分配参考时会出现此错误(C2582:'运算符='功能在' B'中不可用)?

时间:2016-04-22 15:11:00

标签: c++ boost

在这个模板函数中,我试图从boost ptr_map中检索元素。为清楚起见,我省略了错误处理代码。

template <typename K, class T>
class A
{
public:
    void TryGet(const K &key, T &o) { o = mObjects.at(key); }
private:
    boost::ptr_map<K, T> mObjects;
};

typedef A<std::string, B> myClass;

我得到编译器错误C2582:&#39; operator =&#39;功能在&#39; B&#39;中不可用。为什么将mObjects.at()的返回值赋给引用需要访问实例化类的赋值运算符?返回此值的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

  

为什么将mObjects.at()的返回值赋给引用需要访问实例化类的赋值运算符?

当您指定引用时,您将分配引用引用的对象。

int i = 0;
int& iRef = i;   // There is no assignment, just initializing the reference.
iRef = 10;       // Same as i = 10

更新,以回应OP的评论

您所看到的相当于:

int j = 10;
int& jRef = j;
iRef = jRef;     // Same as i = j

答案 1 :(得分:2)

我认为你要问&#34;为什么我不能重新定位参考&#34;?

我的意思是你创建了一个引用变量ref1a)的引用(让我们称之为int& ref1 = a;),如果你有另一个引用引用变量ref2(int&amp; ref2 = b;`)的引用(b),你想知道原因:

ref1 = ref2; 

不会将ref1更改为引用b,而不是a = b

这是对的吗? 如果是这样,答案是&#34;现在不能引用C ++中的工作&#34;。它们只能初始化一次,之后就无法更改。

以下是对此主题的讨论:Why are references not reseatable in C++

答案 2 :(得分:1)

现在我明白了。您不知道引用如何在C ++中工作。也许你对Java的熟悉让你偏离轨道。在C ++中,引用是简单的别名 - 因此您试图直接分配给相关对象(您指出的对象是不合法的)。在Java中,"references"大致相当于C ++ smart pointers。通过将不可控制的类型包装在那些类型中,您可以使这种方法有效。

{{1}}

答案 3 :(得分:0)

您的代码问题是

boost::ptr_map<K, T> mObjects;

boost :: ptr_map需要带有重载赋值运算符的两类。如果要使用boost :: ptr_map

,则必须在类型B中重载赋值运算符