1

以下のコードで、GCC v4.6 で -Wunused-but-set-variable 警告が表示されます。

for ( auto i : f.vertexIndices ) {
    Sy_MatrixFuzzyHashable< Vector3f > wrapper( cp );
    if ( !vMapper.contains( wrapper ) ) {
        mesh.vertexNormals() << cp;
        i.normal = mesh.vertexNormals().size() - 1;
     } else {
        i.normal = vMapper.value( wrapper );
     }
}

警告は具体的には次のとおりです。

warning: variable 'i' set but not used [-Wunused-but-set-variable]

i要素のコピーである場合、警告は理にかなっていますvertexIndicesが、QListオブジェクト (STL 準拠の Qt コンテナー クラス) であるため、範囲ベースの for ループは begin() および end() イテレーター ゲッターを呼び出す必要があり、常に返されます。非定数イテレータ (コンテナが非定数である限り - それはそうです)。

C++11 の新しい機能を利用するようにコード ベースを変更しているため、現在、正常に機能しているかどうかをテストできません。そのため、まだ何もコンパイルされていません。しかし、この警告がナンセンスなのか、それとも自動ループと範囲ベースの for ループを誤解しているのか、誰かが教えてくれることを望んでいました...

4

3 に答える 3

7

問題は、次のように記述されているように、forループであると思います。

for ( auto i : f.vertexIndices ) 

は、格納されている頂点への参照ではなく、その頂点のコピーを取得しています。ここでのコンパイラの警告はi、保存された頂点ではなく一時的なコピーを変更しているため、の値を設定しているが、それを読み取っていないことを示しています。

に変更した場合

for ( auto& i : f.vertexIndices ) 

内部に格納されている頂点を実際に変更しているので、この問題はなくなるはずです。

お役に立てれば!

于 2012-02-03T21:33:43.083 に答える
0

http://en.wikipedia.org/wiki/Foreach_loop#C.2B.2B

例を示していますが、はい、foreachの参照オブジェクトである必要があります

    #include <iostream>
    int main()
    {
      int myint[] = {1,2,3,4,5};

      for (int& i: myint)
      {
        std::cout << i << std::endl;
      }
    }

また

    #include <QList>
    #include <QDebug>

    int main() {
            QList<int> list;
            list << 1 << 2 << 3 << 4 << 5;
            foreach (int i, list) {
                    qDebug() << i;
            }
    }
  • ウィキペディアの礼儀
于 2012-02-03T21:39:58.117 に答える
0

あなたは誤解しautoました。この loop:
for ( auto i : f.vertexIndices )
は、実際には :
for ( auto & i : f.vertexIndices )

于 2012-02-03T21:35:13.283 に答える