1

私はの宣言がある状況にありvector<vector<string>>ます。Windowsでは、これを構造体で宣言できますvector<vector<string>>v={{"me","you"}}が、Linuxマシンではエラーのみなので、構造体の初期化後に宣言する必要がありますがmystruct.vec[0]={"me","you"}、セグメンテーション違反が発生するためです。何か疑惑はありますか?

4

2 に答える 2

2

-std=c++0xGCC を使用している場合は、この C++11 初期化機能をサポートするバージョンが必要です。次に、コンパイラにフラグ (または=std=c++114.7 シリーズの場合)を渡して C++11 モードでコンパイルするように指示する必要があります。GCC 4.7.2 でコンパイルされたこのデモを参照してください。

#include <vector> 
#include <string>   
int main() 
{   
  std::vector<std::vector<std::string>> v = {{"me","you"}}; 
}
于 2013-03-03T23:19:33.990 に答える
2

gcc 4.7.2 のこのプログラムは問題なく動作します。

#include <vector>
#include <string>
#include <utility>
#include <iostream>

using ::std::vector;
using ::std::string;
using ::std::move;

vector<vector<string>> foo()
{
   vector<vector<string>>v={{"me","you"}};
   return move(v);
}

int main()
{
   using ::std::cout;

   cout << "{\n";
   for (auto &i: foo()) {
      cout << "   {\n";
      for (auto &o: i) {
         cout << "      \"" << o << "\",\n";
      }
      cout << "   },\n";
   }
   cout << "}\n";
   return 0;
}

次の出力が生成されます。

$ /tmp/a.out 
{
   {
      "me",
      "you",
   },
}

あなたの問題は古いコンパイラか、コードの他の場所に別の問題があると思います。

このコマンドラインを使用してコンパイルしました:

$ g++ -std=gnu++0x -march=native -mtune=native -Ofast -Wall -Wextra vvstr.cpp

そして、私の g++ はこれをバージョンとして提供します:

$ g++ --version
g++ (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

このページでは、gcc のどのバージョンにどの C++ 機能があるかを示します。

于 2013-03-03T23:23:29.467 に答える