C++11 如何让boost::mpl::map的*任何*示例工作?

C++11 如何让boost::mpl::map的*任何*示例工作?,c++11,boost,metaprogramming,C++11,Boost,Metaprogramming,这是我的示例代码。有人能帮我吗 #include <string> #include <utility> //Not strictly necessary (gets imported implicitely anyway) #include <boost/mpl/map.hpp> #include <boost/mpl/size.hpp> #include <boost/type_traits/is_same.hpp> typede

这是我的示例代码。有人能帮我吗

#include <string>
#include <utility> //Not strictly necessary (gets imported implicitely anyway)
#include <boost/mpl/map.hpp>
#include <boost/mpl/size.hpp>
#include <boost/type_traits/is_same.hpp>

typedef boost::mpl::map<
      std::pair<int,unsigned>
    , std::pair<char,unsigned char>
    > m;

int main()
{
    std::pair<int,unsigned> b(10,10); //this works
    int a = boost::mpl::size<m>::value; //this doesn't
}
#包括
#include//并非严格必需(无论如何都会隐式导入)
#包括
#包括
#包括
typedef boost::mpl::map<
std::pair
,std::pair
>m;
int main()
{
std::对b(10,10);//这是有效的
int a=boost::mpl::size::value;//这不是
}
错误消息:

In file included from /home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map/aux_/include_preprocessed.hpp:47:0,
                 from /home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map/map10.hpp:28,
                 from /home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map/map20.hpp:19,
                 from /home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map.hpp:36,
                 from /home/adam/c++/tests/simple_test/test2.cpp:3:
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp: In instantiation of ‘struct boost::mpl::map2<std::pair<int, unsigned int>, std::pair<char, unsigned char> >’:
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/aux_/preprocessed/gcc/map.hpp:51:8:   required from ‘struct boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> >’
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/aux_/has_tag.hpp:20:1:   required by substitution of ‘template<class U> static char (& boost::mpl::aux::has_tag<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> >, mpl_::bool_<false> >::gcc_3_2_wknd::test<U>(const volatile boost::mpl::aux::type_wrapper<T>*, boost::mpl::aux::type_wrapper<typename U::tag>*))[2] [with U = boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> >]’
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/aux_/has_tag.hpp:20:1:   required from ‘const bool boost::mpl::aux::has_tag<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> >, mpl_::bool_<false> >::value’
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/aux_/has_tag.hpp:20:1:   required from ‘struct boost::mpl::aux::has_tag<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> >, mpl_::bool_<false> >’
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/sequence_tag.hpp:110:8:   required from ‘struct boost::mpl::sequence_tag<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> > >’
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/size.hpp:29:8:   required from ‘struct boost::mpl::size<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> > >’
/home/adam/c++/tests/simple_test/test2.cpp:15:29:   required from here
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp:31:8: error: no type named ‘first’ in ‘struct std::pair<char, unsigned char>’
 struct map2
        ^~~~
In file included from /home/adam/c++/tests/simple_test/test2.cpp:4:0:
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/size.hpp: In instantiation of ‘struct boost::mpl::size<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> > >’:
/home/adam/c++/tests/simple_test/test2.cpp:15:29:   required from here
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/size.hpp:29:8: error: no class template named ‘apply’ in ‘struct boost::mpl::size_impl<boost::mpl::non_sequence_tag>’
 struct size
        ^~~~
/home/adam/c++/tests/simple_test/test2.cpp: In function ‘int main()’:
/home/adam/c++/tests/simple_test/test2.cpp:15:31: error: ‘value’ is not a member of ‘boost::mpl::size<boost::mpl::map<std::pair<int, unsigned int>, std::pair<char, unsigned char> > >’
  int a = boost::mpl::size<m>::value; //this doesn't
                               ^~~~~
/home/adam/c++/tests/simple_test/test2.cpp:15:6: warning: unused variable ‘a’ [-Wunused-variable]
  int a = boost::mpl::size<m>::value; //this doesn't
      ^
CMakeFiles/libsimple_test.dir/build.make:62: recipe for target 'CMakeFiles/libsimple_test.dir/test2.cpp.o' failed
make[2]: *** [CMakeFiles/libsimple_test.dir/test2.cpp.o] Error 1
CMakeFiles/Makefile2:142: recipe for target 'CMakeFiles/libsimple_test.dir/all' failed
make[1]: *** [CMakeFiles/libsimple_test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
包含在/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqqq7hpgw7j/include/boost/mpl/map/aux_u/include_预处理文件中。hpp:47:0,
来自/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tpihmi5biqrq7hpgw7j/include/boost/mpl/map/map10.hpp:28,
来自/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map/map20.hpp:19,
来自/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/map.hpp:36,
from/home/adam/c++/tests/simple_test/test2.cpp:3:
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5bikrq7hpgw7j/include/boost/mpl/map/aux_/preprocessed/typeof_-based/map10.hpp:在“struct boost::mpl::map2”的实例化中:
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5bikrq7hpgw7j/include/boost/mpl/aux_u/preprocessed/gcc/map.hpp:51:8:必须来自“struct boost::mpl::map”
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tpihmi5bikrq7hpgw7j/include/boost/mpl/aux_u/has_标记。hpp:20:1:替换“模板静态字符(&boost::mpl::aux::has_标记::gcc_3_2_wknd::test(常量volatile boost::mpl::aux::aux::type_u包装器*),boost::aux::aux::type_u包装器*)”所需[2][使用U=boost::mpl::map]'
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/aux_u/has_u标签。hpp:20:1:const bool boost::mpl::aux::has_u标签::value'
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/aux_u/has_标记。hpp:20:1:必须来自“struct boost::mpl::aux::has_标记”
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5biqrq7hpgw7j/include/boost/mpl/sequence_标记。hpp:110:8:必须来自“struct boost::mpl::sequence_标记”
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5bikrq7hpgw7j/include/boost/mpl/size.hpp:29:8:必须来自“struct boost::mpl::size”
/home/adam/c++/tests/simple_test/test2.cpp:15:29:此处为必填项
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5bikrq7hpgw7j/include/boost/mpl/map/aux_/preprocessed/typeof_-based/map10.hpp:31:8:错误:在“struct std::pair”中没有名为“first”的类型
结构映射2
^~~~
在/home/adam/c++/tests/simple\u test/test2.cpp:4:0中包含的文件中:
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5bikrq7hpgw7j/include/boost/mpl/size.hpp:在“struct boost::mpl::size”的实例化中:
/home/adam/c++/tests/simple_test/test2.cpp:15:29:此处为必填项
/home/adam/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.67.0-xcr4z3warx5tptvihmi5bikrq7hpgw7j/include/boost/mpl/size.hpp:29:8:错误:在“struct boost::mpl::size_impl”中没有名为“apply”的类模板
结构大小
^~~~
/home/adam/c++/tests/simple_test/test2.cpp:在函数“int main()”中:
/home/adam/c++/tests/simple_test/test2.cpp:15:31:错误:“value”不是“boost::mpl::size”的成员
int a=boost::mpl::size::value;//这不是
^~~~~
/home/adam/c++/tests/simple_test/test2.cpp:15:6:警告:未使用的变量“a”[-Wunused variable]
int a=boost::mpl::size::value;//这不是
^
CMakeFiles/libsimple_test.dir/build.make:62:目标“CMakeFiles/libsimple_test.dir/test2.cpp.o”的配方失败
make[2]:***[CMakeFiles/libsimple_test.dir/test2.cpp.o]错误1
CMakeFiles/Makefile2:142:目标“CMakeFiles/libsimple_test.dir/all”的配方失败
make[1]:***[CMakeFiles/libsimple_test.dir/all]错误2
Makefile:83:目标“全部”的配方失败
make:**[全部]错误2

我在GCC 7.3.0上使用C++11,在Ubuntu 16.04 64位上使用libboost 1.67.0。

碰巧我找到了一个解决方案:不要使用标准的
std::pair
,而是使用重新发明的
boost::mpl::pair
。在将
std::pair
简单地替换为
boost::mpl::pair
之后,示例代码可以正确编译和运行…这是什么这引出了另一个问题。

是的,你可能是对的。这就是原因。@bolovIt不是“再发明的”,对于一个完全不同的目的,它是一个完全不同的东西。
boost::mpl::pair
不存储类型为
a
B
的元素,不像
std::pair
boost::mpl::pair::first
boost::mpl::pair::second
是类型,而
std::pair::first
std::pair::ssecond
是值。毫不奇怪它没有编译。@lisyarus不是一个值,并不意味着它也必须是正确的类型?仅对
::first
::second
的类型使用
std::pair
有什么错(丢弃运行时值)@AdamRyczkowski在MPL中,类型
first
second
是该对所持有的值。对于标准对,运行时数据
first
second
是值,这些值具有类型。