以下のコードで次のエラーが発生します。
expected constructor, destructor, or type conversion before '=' token
--
#include <string>
#include <map>
class Foo {
};
std::map<std::string, Foo> map;
map["bar"] = Foo();
int main()
{
return 0;
}
以下のコードで次のエラーが発生します。
expected constructor, destructor, or type conversion before '=' token
--
#include <string>
#include <map>
class Foo {
};
std::map<std::string, Foo> map;
map["bar"] = Foo();
int main()
{
return 0;
}
map["bar"] = Foo(); // This line is a statement not a declaration.
// You have to put it in main, or any execution context
C++0x が主流になるまでは、boost
. 充填map
はケーキになります。次に例を示します。
std::map<std::string, Foo> mymap;
...
int main()
{
insert(mymap)
("First", Foo(...))
("Second", Foo(...))
("Third", Foo(...));
...
}
あなたが見たように、簡単な答えは次のとおりです。それはできません。
あなたが本当に欲しいのはこれだと思います:
std::map<std::string, Foo> map;
int main()
{
map["bar"] = Foo();
初期化を実行する前に本当に必要な場合は、次のmain()
ような例がよく見られます。
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
} _helper_obj;
}
map
ただし、以前に作成されたという保証がないという新しい問題があり_helper_obj
ます。これを回避する 1 つの方法は、それらを組み合わせることです。
namespace {
struct StaticInitHelper : public std::map<std::string, Foo> {
StaticInitHelper() { (*this)["bar"] = Foo(); }
} map;
}
ただし、STL コンテナ クラスから継承することは一般的に推奨されません。この例では、他のコンストラクターが隠され、STL 基本クラスには仮想デストラクタがないことに注意してください。これは多くの人にとって「ハッキング」と見なされるため、実際には避けるべきです。
さらに別の方法として、クラスを次のように定義することもできますstd::map
。
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
std::map<std::string, Foo> map;
} map_holder;
}
map_holder.map.find(...
しかしもちろん、これはマップの使用を複雑にします。
アップデート:
を使用して、別のオプションについて言及するのを忘れていましたboost::assign
:
#include <boost/assign/list_of.hpp>
map<int,int> map = boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
ただし、静的オブジェクトで安全かどうかに関する情報は見つかりません。
あなたが欲しいのは静的初期化子のようです。これを読むことをお勧めします。静的初期化子の使用と、その主な落とし穴である静的初期化順序の例です。