3

MSVC++の「utility」ヘッダーでのmake_pairの定義は次のとおりです。

template <class _Ty1、
 クラス_Ty2>インライン
 ペア<_Ty1、_Ty2> make_pair(_Ty1 _Val1、_Ty2 _Val2)
 {//引数から構成されるペアを返す
 return(pair <_Ty1、_Ty2>(_ Val1、_Val2));
 }

引数の型を山かっこで囲まに、make_pairを常に使用しています。

    map <string、int> theMap;

    theMap.insert(make_pair( "string"、5));

make_pair最初の引数がそうではないことを言う必要はstd::stringありませんchar*か?

どうやって知るの?

4

4 に答える 4

12

関数テンプレート呼び出しは通常make_pair<…&gt;、C ++03§14.8.2で定義されている引数の演繹によって明示的なテンプレート引数(つまり)を回避できます。抜粋:

関数テンプレートの特殊化が参照される場合、すべてのテンプレート引数に値が必要です。値は明示的に指定することも、場合によっては使用から推測することもできます。

特定のルールは少し複雑ですが、一般的に十分な資格を持つ専門分野が1つしかない限り、通常は「正しく機能」します。

あなたの例では、2つの推論ステップと1つの暗黙的な変換を使用しています。

  • make_pairを返しますpair<char const*, int>
  • 次に、メンバーごとの初期化をtemplate<class U, classV> pair<string,int>::pair( pair<U,V> const & )開始して実行します。U = char*, V = int
  • 呼び出しstring::string(char*)ます。
于 2010-04-19T23:03:31.827 に答える
9

そうではありません。make_pairは、pair <char *、int>(またはpair <char const *、int>)を生成しました。

ただし、ペアの実装に注意する場合は、テンプレート化されたコピーコンストラクターがあります。


template < typename Other1, typename Other2 > 
pair(pair<Other1,Other2>& other) 
  : first(other.first), second(other.second)
{}

これはわずかに異なる方法で実装できますが、同じことです。このコンストラクターは暗黙的であるため、コンパイラーはペア<char *、int>からペア<std :: string、int>を作成しようとします-必要なタイプは変換可能であるため、これは機能します。

于 2010-04-19T23:06:16.097 に答える
1

make_pair()引数タイプの推定を使用してテンプレートパラメータタイプを決定できるように、正確に存在します。

このSOの質問を参照してください:テンプレートパラメーターの推定を活用するための疑似コンストラクターとしての無料関数の使用

于 2010-04-19T23:03:42.307 に答える
1

これは、std::stringのコンストラクターがconstchar*を受け入れるという事実に依存しています。std::stringのこのコンストラクターが明示的であるかどうかは関係ありません。テンプレートは型を差し引き、ペアのコピーコンストラクターを使用して変換します。ペアコンストラクタが明示的であるかどうかも関係ありません。

std :: stringのコンストラクターを次のように変換すると、次のようになります。

class string
{
public:
    string(char* s)
    {
    }   
};

このエラーが発生します:

/usr/include/c++/4.3/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = const char*, _U2 = int, _T1 = const string, _T2 = int]’:
foo.cpp:27:   instantiated from here
/usr/include/c++/4.3/bits/stl_pair.h:106: error: invalid conversion from ‘const char* const’ to ‘char*’
/usr/include/c++/4.3/bits/stl_pair.h:106: error:   initializing argument 1 of ‘string::string(char*)’

コンストラクターは次のようになります。

  template<class _U1, class _U2>
    pair(const pair<_U1, _U2>& __p)
    : first(__p.first),
      second(__p.second) { }

コピーコンストラクタは次のようになります。

template<class _U1, class _U2>
pair(const pair<_U1, _U2>& __p)
    : first(__p.first),
      second(__p.second) { }
于 2010-04-19T23:04:23.607 に答える