在尝试编写调用MPL代码的元函数时,我似乎错过了一些东西。以下代码无法在inst2上编译时出现以下错误,但在inst1上工作正常:
错误C2903:'apply':symbol既不是类模板也不是函数模板
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;
}
答案 0 :(得分:1)
我认为您在::type
的typedef中忘记了at_c
后面的inst2
。回想一下,您的first_element
期望可以应用at_c
的内容。但是,原始at_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;
}
Live Example。作为进一步检查,我确认inst1
上的进一步解除引用与inst2
的类型相同。