2017-10-03 12 views
-1

私の意見では、彼らは同じです。しかし、Visual Studio 2015では、彼らは間違いなく異なっています。"multiset <int、greater <int>> ms1"と "multiset <int> ms2(より大きい<int>()の違いは何ですか?"

//Ok, work properly 
multiset<int, greater<int> > ms1; 
ms1.insert(10); 
ms1.insert(20); 

//error, why? 
multiset<int> ms2(greater<int>()); 
ms2.insert(30); 
ms2.insert(40); 

なぜわからないのですか?あなたの最初の例

+0

いいえ、同じではありません。あなたは彼らが同じであるという考えを与えたのは何ですか? –

+0

回答はありません[ここ](http://en.cppreference.com/w/cpp/container/multiset)? – user0042

+2

@ user0042:そうではありません。この質問は、テンプレート引数と関数/コンストラクタ引数の違いについての理解の欠如に関するものです。これはコア言語の問題です。これは本当に 'std :: multiset'ではなく、この誤解が明らかになったときに遊んでいたおもちゃです。 –

答えて

4

multiset<int, greater<int> > ms1; 

これはms1intを格納し、タイプstd::greater<int>の比較ファンクタを使用して、std::multisetであると述べています。あなたは、コンストラクタの引数を残してきたので、ファンクタのインスタンスは、このようなあなたがstd::greater<int>{}を通過した正確かのように、1を構築し、デフォルト、次のとおりです。あなたの2番目の例では

multiset<int, greater<int> > ms1(greater<int>{}); 

multiset<int> ms2(greater<int>()); 

これは少しトリッキーです。ここには2つの問題があります。最初のものは、「最も退屈なパース」と呼ばれるものに関連しています。それは何度も答えられているので、私はそれらの答えの1つに簡単にリンクします。 Most vexing parse: why doesn't A a(()); work?

それでは、あなたがいることを理解すると仮定しましょう、そしてこれに応じて、あなたのコードを変更します。この場合、

multiset<int> ms2(greater<int>{}); 
// or this 
multiset<int> ms2((greater<int>())); 

を、あなたは比較ファンクタの種類を残して、デフォルトで行ってきました。デフォルトはstd::less<int>です。したがって、上記の行がこれに相当します

multiset<int, std::less<int> > ms2(greater<int>{}); 

何と言うことはms2intを格納し、タイプstd::less<int>の比較ファンクタを使用して、std::multisetであるということです。次に、std::greater<int>のインスタンスをコンストラクタに渡します。 std::less<int>std::greater<int>は異なるタイプです。一方のインスタンスを、他方のインスタンスを予期している関数に渡すことはできません。

+0

@Tango Xiao:私は1つの問題について忘れてしまいました。私は答えを更新しました。 –

+0

@TangoXiao:上のコメントを参照してください。要約すると、 'multiset > ms3(より大きい {});' –

+0

あなたの答えは素晴らしいです。わかりました。どうもありがとうございました。 –

関連する問題