在这个模板函数中,我试图从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()的返回值赋给引用需要访问实例化类的赋值运算符?返回此值的正确方法是什么?
答案 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;?
我的意思是你创建了一个引用变量ref1
(a
)的引用(让我们称之为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中重载赋值运算符