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()がコピー先オブジェクト (返された値を type の変数に代入している場合const_iterator) または別の一時的Matrice<T>::cend()に呼び出された場所にコピー (または、C++ 11 では移動されたと思います) されます。 . 詳細については、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 に答える