0

我不明白为什么下面的代码不起作用,知道吗?

template <class T>
class Matrice
{
public:
...
    typedef typename std::vector<T>::const_iterator const_iterator;
    const_iterator& cend ( )
    {
        return valeurs.cend ( );
    }
...
private:
...
}

这是编译器的抱怨:

/Users/Aleks/Documents/DS OO/DS OO/Matrice.h:70:16:对“const_iterator”(又名“__wrap_iter”)类型的非 const 左值引用无法绑定到“const_iterator”(又名“ __wrap_iter')

4

3 回答 3

3

valeurs.cend( cppreference ) 将一个实例返回给 a const_iterator(也就是说,它被声明为const_iterator valeurs.cend())。

编译器需要创建一个临时对象(内存区域)来存储valeurs.cend(). 此代码无法编译,因为您无法获取临时引用,因为后者不会超过函数调用。

您通常会按值返回一个迭代器:

typedef typename std::vector<T>::const_iterator const_iterator;
const_iterator cend ( )
{
    return valeurs.cend ( );
}

这将确保返回的值valeurs.cend()被复制(或移动,在 C++11 中,我相信)到它的目标对象(如果你将返回的值分配给 type 的变量const_iterator)或另一个临时Matrice<T>::cend()调用的地方. 有关详细信息,请参阅 MSDN 说明的链接。

于 2013-01-29T20:34:25.487 回答
1

hmjd 是对的,您只需要 const_iterator,而不是参考。您不能使用引用的原因是 valeurs.cend () 是堆栈上的临时值,一旦函数返回,引用(如果可以使用)将无效。

于 2013-01-29T20:33:01.067 回答
1

正如其他人所说,以下行:

const_iterator& cend ( )

需要是:

const const_iterator& cend ( )

或者:

const_iterator cend ( )
于 2013-01-29T20:34:11.820 回答