ошибка аргумента метафункции операции преобразования boost::mpl

В веб-документации Boost MPL , в нем говорится о передаче классов метафункций в качестве аргументов для boost::mpl::transform. Аргумент метафункции в этом случае должен быть какой-то операцией, выполняемой над mpl::ForwardSequence. Однако при применении mpl::transform к mpl::map с использованием простого класса метафункций я получаю ошибки шаблона. (Поскольку эти ошибки довольно обширны, я включил только то, что, по моему мнению, является уместным. Я более чем счастлив опубликовать более подробный отчет об ошибках, если потребуется.)

Ошибка:

/usr/include/boost/mpl/aux_/preprocessed/gcc/bind.hpp:207:21: error: no type named     ‘type’ in ‘struct boost::mpl::apply_wrap2<boost::mpl::push_front<mpl_::na, mpl_::na>, boost::mpl::map0<>, boost::mpl::pair<unsigned int, INT32U> >’
test_boost_mpl.cpp:106:1: error: ‘from_native_tmap’ was not declared in this scope

В моем конкретном случае мой код выглядит следующим образом:

/* stl includes */
#include <cstdint>

/* boost includes */
#include <boost/type_traits.hpp>
#include <boost/type_traits/is_same.hpp>

#include <boost/mpl/at.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/empty.hpp>

#include <boost/mpl/assert.hpp>
#include <boost/mpl/transform.hpp>

struct Boolean {
  enum { tag_value = 0x83 };
};

struct INT32U {
  enum { tag_value = 0x84 };
};

typedef mpl::map
< 
  mpl::pair<Boolean, bool>,
  mpl::pair<INT32U, std::uint32_t>
> to_native_tmap;

struct swap_f {
  template<typename PAIR>
  struct apply {
    typedef typename mpl::pair<typename PAIR::second, typename PAIR::first> type;
  };
};

typedef mpl::transform<to_native_tmap, swap_f>::type from_native_tmap;

BOOST_MPL_ASSERT(( is_same
                   <mpl::at<from_native_tmap, bool>::type, Boolean> ));
BOOST_MPL_ASSERT(( is_same
                   <mpl::at<from_native_tmap, std::uint32_t>::type, INT32U> ));

int main(void) { return 0; }

Мое намерение состоит в том, чтобы иметь сопоставление с собственными типами С++ в to_native_tmap, а затем обратное сопоставление в from_native_tmap.

Этот код завершается ошибкой либо при BOOST_MPL_ASSERT(), либо при попытке создать экземпляр типа to_native_tmap mpl::map.

Большое спасибо!' перед тем, кто готов помочь.


person maaronking    schedule 03.04.2013    source источник
comment
Добро пожаловать в Stackoverflow! пожалуйста, дайте минимальный самостоятельный пример, который воспроизводит вашу проблему (в данном случае показывает ваш native_to_goose_tmap)   -  person TemplateRex    schedule 03.04.2013
comment
Спасибо за прием. Прошу прощения, что не сделал этого изначально. Я новичок как в Stack Overflow, так и в метапрограммировании шаблонов, поэтому благодарю вас за терпение.   -  person maaronking    schedule 03.04.2013
comment
извинений не требуется, но обязательно прочитайте часто задаваемые вопросы   -  person TemplateRex    schedule 03.04.2013


Ответы (1)


person    schedule
comment
Спасибо, что нашли время ответить. Я запущу код и проголосую/приму, как только вернусь с обеда. - person maaronking; 03.04.2013
comment
@maaronking код компилируется и работает правильно на gcc 4.7.2 и, возможно, на гораздо более ранних версиях (потому что Boost.MPL не изменился с годами) - person TemplateRex; 03.04.2013
comment
@user2241635 user2241635 вы действительно должны получить именную учетную запись SO, потому что, если вы можете так легко ответить на эти вопросы Boost.MPL, вы действительно можете помочь здесь! - person TemplateRex; 03.04.2013
comment
@ user2241635 rhalbersma верен в обеих учетных записях. Ваше решение работает отлично, и вы должны получить именованную учетную запись. Уже пару дней ломаю голову над этой проблемой. Спасибо, что нашли время предоставить рабочее решение. - person maaronking; 03.04.2013
comment
Я бы проголосовал за ответ, но у меня недостаточно «репутации». Прости. Я выбрал его в качестве рабочего решения. - person maaronking; 03.04.2013