1

以下のコードで次のエラーが発生します。

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;
}
4

3 に答える 3

13
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(...));
   ...
}
于 2009-10-26T23:14:30.020 に答える
4

あなたが見たように、簡単な答えは次のとおりです。それはできません。

あなたが本当に欲しいのはこれだと思います:

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);

ただし、静的オブジェクトで安全かどうかに関する情報は見つかりません。

于 2009-10-26T23:27:33.813 に答える
1

あなたが欲しいのは静的初期化子のようです。これを読むことをお勧めします。静的初期化子の使用と、その主な落とし穴である静的初期化順序の例です。

于 2009-10-26T23:21:24.607 に答える