我无法理解为什么以下代码无效,有什么想法?
template <class T>
class Matrice
{
public:
...
typedef typename std::vector<T>::const_iterator const_iterator;
const_iterator& cend ( )
{
return valeurs.cend ( );
}
...
private:
...
}
这是complilator的抱怨:
/ Users / Aleks / Documents / DS OO / DS OO / Matrice.h:70:16:non-const lvalue 引用类型'const_iterator'(又名'__wrap_iter') 无法绑定到'const_iterator'类型的临时(也称为 '__wrap_iter')
答案 0 :(得分:3)
valeurs.cend
(cppreference)将实例返回给const_iterator
(也就是说,它被声明为const_iterator valeurs.cend()
)。
编译器需要创建temporary object(内存区域)来存储valeurs.cend()
返回的值。此代码无法编译,因为您无法获取临时的引用,因为后者不会比函数调用更长。
您通常会按值返回迭代器:
typedef typename std::vector<T>::const_iterator const_iterator;
const_iterator cend ( )
{
return valeurs.cend ( );
}
这将确保valeurs.cend()
返回的值被复制(或移动,在C ++ 11中,我相信)到其目标对象(如果您将返回的值分配给类型的变量) const_iterator
}或在Matrice<T>::cend()
被调用的任何临时地点。有关详细信息,请参阅MSDN说明的链接。
答案 1 :(得分:1)
hmjd是对的,你只需要const_iterator,而不是引用。你不能使用引用的原因是valeurs.cend()是堆栈上的临时值,引用(如果你可以使用它)在函数返回时就不会有效。
答案 2 :(得分:1)
正如其他人所说,以下一行:
const_iterator& cend ( )
需要成为:
const const_iterator& cend ( )
或者:
const_iterator cend ( )