const_iterator和模板,编译错误

时间:2013-01-29 20:25:25

标签: c++ templates iterator

我无法理解为什么以下代码无效,有什么想法?

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')

3 个答案:

答案 0 :(得分:3)

valeurs.cendcppreference)将实例返回给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 ( )