我对Boost MPL(以及一般的元编程)相当新,我认为我对模板与类型的想法感到困惑。我正在使用的一个简单示例是尝试计算向量的长度。以下编译正常:
typedef mpl::vector_c< int, 0, 1, 2, 3, 4, 5, 6, 7 > myVector;
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
};
};
typedef TestSize::apply<myVector>::type result;
但如果我添加&#34; :: type&#34;对于大小计算的结果,如下所示:
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence>::type type;
};
};
typedef TestSize::apply<myVector>::type result;
然后我得到错误&#34;错误:nontype&#34; boost :: mpl :: size :: type [with Sequence = mySequence]&#34;不是类型名称&#34;。
这是不是因为它在嵌套命名空间中而推断出模板参数的情况吗?令我困惑的是以下事实:
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
typedef mpl::range_c<int, 0, type::type::value> myRange;
};
};
typedef TestSize::apply<myVector>::type result;
typedef TestSize::apply<textureIndices>::myRange range;
我为什么要这样做&#34;输入:: type :: value&#34;在那里,但不是&#34;尺寸&lt; mySequence&GT; ::类型&#34;在线之前?
答案 0 :(得分:3)
您遇到此错误的原因是您需要使用typename
这样的内容{在内部apply
中):
struct TestSize
{
template <typename mySequence> struct apply
{
typedef typename mpl::size<mySequence>::type type; // <-- here!
};
};
在此上下文中对typename
的需求源于编译器编译模板的方式。当模板最初预编译时,它需要在语义上正确。但是,编译器不知道(此时)mpl::size<mySequence>::type
确实是一种类型。此时,它不知道mySequence
是什么,以及如何为mpl::size
指定mySequence
。默认情况下,它假定它不是类型。所以你需要提示它。
现在您可能理解为什么type::type::value
工作正常 - 编译器默认认为value
不是类型,您不是要将它用作类型,编译器很高兴。顺便说一句,如果你要将value
定义为某种特殊化的类型,那么如果使用这种特化,你会有一个有趣的编译错误!