キーを構造のようなネイティブ データ型にマップするにはどうすればよいですか?
これを抜粋して書いたのですが、コンパイルできませんでした。それを修正する方法についてのアイデアはありますか?
#include <map>
#include <iostream>
typedef struct _list
{
int a,b;
}list;
map<int,list> test_map;
int main(void)
{
cout <<"Testing"<< endl;
}
キーを構造のようなネイティブ データ型にマップするにはどうすればよいですか?
これを抜粋して書いたのですが、コンパイルできませんでした。それを修正する方法についてのアイデアはありますか?
#include <map>
#include <iostream>
typedef struct _list
{
int a,b;
}list;
map<int,list> test_map;
int main(void)
{
cout <<"Testing"<< endl;
}
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>
必要に応じて追加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<
ます。
ここにいくつかの問題があります:
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;
}
あなたは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;
}
私はコードパッドの使用をまったく避けようとします。
私はあなたのコードでいくつかのテストを行いましたが、そのようです
using namespace std
必要はありません。map
cout
endl
#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;
しかし、そのコードは間違っています
map<int, _list> test_map;
list
または、構造の名前として使用しないでください(はるかに良い)。(おそらくあなたも持っています
#include <list>
...
using namespace std;
コードのどこかに。