エラー「non-aggregate type ‘vector<int>’ cannot be initialized with an initializer list」の対処方法

以下の初期化式を利用するとコンパイルエラーが発生することがある。

// error: non-aggregate type 'std::vector<int>' cannot be initialized with an initializer list
std::vector<int> v = {1, 2, 3};

// error: non-aggregate type 'std::string' cannot be initialized with an initializer list
std::string s = {'c'};

// error: expected ';' at end of declaration
std::vector<int> v{1, 2, 3};

// error: expected '(' for function-style cast or type construction
std::string s = std::string{"s"};

上記の記法はいずれも、C++03以前の古いコンパイラでは対応していない、初期化リスト(initializer list)や統一初期化記法(uniform initialization)という機能を利用している。

C++11以降の規格に対応したコンパイラでコンパイルする必要がある。コンパイラによってはコンパイラフラグとして-std=c++11を指定することで、C++11を利用することが可能となる場合がある。

// Clang/LLVM
clang++ main.cpp -std=c++11

// GNU/GCC
g++ main.cpp -std=c++11
g++ main.cpp -std=c++0x   // GCC 4.6以前の場合
g++ main.cpp -std=gnu++11 // GNU拡張有効時(gnu++11, gnu++0x)

IDEによってはプロジェクト側のC++ Language Dialectという項目で同等の指定が可能となる場合がある。これを機会にC++11や、より新しい規格であるC++14/C++17への移行を検討してみるのも良いだろう。

広告