1

在尝试编写调用 MPL 代码的元函数时,我似乎遗漏了一些东西。以下代码无法在 inst2 上编译并出现以下错误,但在 inst1 上可以正常工作:

错误 C2903:“应用”:符号既不是类模板也不是函数模板

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;
}

活生生的例子。作为进一步检查,我验证了进一步取消引用 oninst1给出与inst2.

于 2013-08-21T23:08:26.350 回答