6

次のコードの何が問題なのですか:

#include <ctime>
#include <vector>
#include <utility>
#include <algorithm>
#include <iostream>

int main()
{
    std::vector< std::pair< char, unsigned > > vec;

    for( unsigned i = 0; i < 100; ++i )
    {
        char ch = 0;
        unsigned number = 0;

        do {
            ch = i;
            number = i;

        } while( std::find( vec.begin(), vec.end(), std::make_pair< char, unsigned >( ch, number ) ) != vec.end() );

        std::cout << ch << number << '\n';

        vec.push_back( std::make_pair< char, unsigned >( ch, number ) );
    }
}

それはうまくコンパイルされます:

g++ test.cxx

しかし、次のように失敗します:

$ g++ -std=c++11 test.cxx                                                                                                              /tmp
test.cxx: In function 'int main()':
test.cxx:21:98: error: no matching function for call to 'make_pair(char&, unsigned int&)'
test.cxx:21:98: note: candidate is:
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.7/vector:61,
                 from test.cxx:3:
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note:   template argument deduction/substitution failed:
test.cxx:21:98: note:   cannot convert 'ch' (type 'char') to type 'char&&'
test.cxx:25:69: error: no matching function for call to 'make_pair(char&, unsigned int&)'
test.cxx:25:69: note: candidate is:
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.7/vector:61,
                 from test.cxx:3:
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note:   template argument deduction/substitution failed:
test.cxx:25:69: note:   cannot convert 'ch' (type 'char') to type 'char&&'
4

1 に答える 1

14

解決:

この方法でテンプレート引数を明示的に指定する代わりにmake_pair<>():

std::make_pair< char, unsigned >( ch, number )

それらを推測させてください:

std::make_pair( ch, number )

説明:

このガイドラインの背後にある理論的根拠は、std::make_pair<>()が定義されている方法と、テンプレート引数推定がユニバーサル参照に対して機能する方法にあります。C++11 標準の 20.3.3/8-9 項から:

template <class T1, class T2> pair<V1, V2> make_pair(T1&& x, T2&& y);

戻り値:pair<V1, V2>(std::forward<T1>(x), std::forward<T2>(y)); ここで、V1 と V2 は次のように決定さUidecay<Ti>::typeますTi。次に、それぞれViが等しいX&場合は、そうでない場合はです。【:以下の場合】Uireference_wrapper<X>ViUi

return pair<int, double>(5, 3.1415926); // explicit types

C++ プログラムには以下が含まれる場合があります。

return make_pair(5, 3.1415926); // types are deduced

—<em>例の終了]

ここで、T1T2は推定されることを意味します。自分でテンプレート引数を明示的に指定することで、の型推定機構を使用して正しい戻り値の型を生成し、 への右辺値参照および へmake_pair<>()の右辺値参照を受け入れる関数のインスタンス化を強制します。charunsigned

... make_pair(char&&, unsigned&&)

chただし、とは左辺値であるため、入力に右辺値を提供していませんnumber。これは、コンパイラが不平を言っていることです。


別:

また、オブジェクトを暗黙的に構築できることにも注意してstd::pairください。これにより、呼び出しmake_pair<>()がまったく不要になります。

vec.push_back( { ch, number } );
于 2013-02-26T18:21:41.743 に答える