0

キーを構造のようなネイティブ データ型にマップするにはどうすればよいですか?

これを抜粋して書いたのですが、コンパイルできませんでした。それを修正する方法についてのアイデアはありますか?

#include <map>
#include <iostream>

typedef struct _list
{
  int a,b;
}list;
map<int,list> test_map;

int main(void)
{
  cout <<"Testing"<< endl;
}
4

6 に答える 6

4

map は std:: 名前空間にあります。これを修正するには、次の 2 つの方法があります。

using namespace std;
// ...
map<int, list> test_map;

また

std::map<int, list> test_map;

私は 2 番目の方法を好みますが、これは純粋に個人的な選択です。

関連する注意事項として、マップに配置できるものに実際の制限はありませんが、それらはコピー可能/割り当て可能でなければならず、キーの型には < 演算子が必要です (または比較ファンクターを提供することもできます)。 )。

編集:(ありそうもない)または(奇妙だが不可能<list>ではない)のいずれかに含まれているようです。名前空間 std を使用すると、std::list が独自の構造体と衝突します。解決策: 構造体の名前を変更するか、using 名前空間を削除して必要な場所に std:: を配置します。<iostream><map>

于 2010-09-29T20:38:31.407 に答える
2

必要に応じて追加std

mylistとの衝突を避けるため、リストの名前をに変更しましたstd::list。一般的な使用法と衝突する型名と変数名は避けてください。

VS2008 で正常にコンパイルされるようになりました。

#include <map>
#include <iostream>

typedef struct _list
{
    int a,b;
} mylist;

std::map<int,mylist> test_map;

int main(void)
{
    std::cout <<"Testing"<< std::endl;
    return 0;
}

STL コンテナーで構造体を使用しても問題はありませんが、それが完全にコピー可能 (コピー コンストラクター)、割り当て可能 (implements operator=)、および比較可能 (implements) である場合に限りoperator<ます。

于 2010-09-29T20:43:42.847 に答える
1

ここにいくつかの問題があります:

  • using::stdまたはのいずれかが欠落しているため、コンパイラは何を意味するstd::mapのかわかりません。map<int,list>

  • 宣言があると仮定するとusing namespace std、typedeflistが同じ名前の STL コレクションと衝突する可能性があります。名前を変更します。

  • あなたのtypedef struct _tag {...} tag;コンストラクトは、80 年代からの古風な名残です。それは必要ではなく、率直に言ってかなりばかげています。それはあなたに何も得ません。

これが修正されたコードです:

#include <map>
#include <iostream>

struct MyList
{
  int a,b;
};

std::map<int,MyList> test_map;

int main(void)
{
  std::cout <<"Testing"<< std::endl;
  return 0;
}
于 2010-09-29T20:46:24.090 に答える
0

あなたはCから来ているようです。これを試してください:

#include <map>
#include <iostream>

struct list
{
  int a,b;
};

std::map<int,list> test_map;

int main(void)
{
  std::cout <<"Testing"<< std::endl;
  return 0;
}
于 2010-09-29T20:40:18.427 に答える
0

私はコードパッドの使用をまったく避けようとします。

私はあなたのコードでいくつかのテストを行いましたが、そのようです

  • 暗黙の (そして望ましくない) を追加しています。修飾するusing namespace std必要はありません。mapcoutendl
  • (おそらく) を含む、必要以上に多くの標準ヘッダーが含まれてい#include <list>ます。

つまり、コンパイラがコードを見るlistと、あなたのバージョンと のバージョンの 2 つが表示されstdます。using ディレクティブがあるため、両方がマップを作成する行のスコープ内にあり、コンパイラはどちらを使用するかを判断できません。

できる簡単なことは 2 つあります。単純なテスト用の型の名前を別のものに変更するかlist(ツールが名前の選択を強制します!)、使用を完全に修飾します。

#include <map>
struct list {
   int a,b;
};
std::map< int, ::list > the_map;
// ...

codepadは include 自体と using ディレクティブを追加しているため、コンパイルも行われることに注意してください。

struct list {
   int a,b;
};
map<int,::list> the_map;

しかし、そのコードは間違っています

于 2010-09-29T23:46:46.507 に答える
0

map<int, _list> test_map;listまたは、構造の名前として使用しないでください(はるかに良い)。(おそらくあなたも持っています

#include <list>
...
using namespace std;

コードのどこかに。

于 2010-09-29T20:43:11.693 に答える