1

MPL コードを呼び出すメタ関数を作成しようとすると、何かが足りないようです。次のコードは、inst2 では次のエラーでコンパイルに失敗しますが、inst1 では正常に動作します。

エラー C2903: 'apply': シンボルはクラス テンプレートでも関数テンプレートでもありません

using namespace boost::mpl;

template <typename VECTOR>
struct first_element : mpl::at_c<VECTOR, 0> {};

int main()
{
    typedef vector<
        vector<int, int>,
        vector<int, int>,
        vector<int, int>> lotso;

    typedef mpl::transform<lotso,
        first_element<_1>>::type inst1;

    typedef first_element<
        at_c<lotso,0>>::type inst2;

    return 0;
}
4

1 に答える 1

1

typedef for の内側::typeへの呼び出しの背後にあることを忘れたと思います。適用できるものを期待していることを思い出してください。ただし、 rawはまだ評価されていません。メタ関数の評価は、 を追加することによって行われます。at_cinst2first_elementat_cat_c<lotso, 0>::type

#include <boost/mpl/vector.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/placeholders.hpp>
#include <type_traits>

using namespace boost;
using namespace boost::mpl;

template <typename VECTOR>
struct first_element : mpl::at_c<VECTOR, 0> {};

int main()
{
    typedef vector<
        vector<int, int>,
        vector<int, int>,
        vector<int, int>> lotso;

    typedef mpl::transform<lotso,
        first_element<_1>>::type inst1;

    typedef first_element<
        at_c<lotso,0>::type >::type inst2;
                     ^^^^^^ <--- you forgot a ::type here

    static_assert(std::is_same<first_element<inst1>::type, inst2>::value, "bingo");

    return 0;
}

ライブの例。さらなるチェックとして、さらに逆参照inst1すると と同じ型inst2

于 2013-08-21T23:08:26.350 に答える