我对于增强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;但是,如果我在大小计算的结果中添加“:type”,如下所示:
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence>::type type;
};
};
typedef TestSize::apply<myVector>::type result;然后,我得到错误" error : nontype "boost::mpl::size::type with Sequence=mySequence“不是类型名称”。
这是因为模板参数在嵌套的命名空间中而没有推导的情况吗?使我更加困惑的是,以下是编译:
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;为什么我可以在那里做"type::type::value“,而不能在前面行上做"size< mySequence>::type”呢?
发布于 2016-03-22 16:21:29
出现此错误的原因是需要像这样使用typename (在内部apply中):
struct TestSize
{
template <typename mySequence> struct apply
{
typedef typename mpl::size<mySequence>::type type; // <-- here!
};
};在此上下文中对typename的需求来自编译器编译模板的方式。当模板最初被预编译时,它需要在语义上正确。然而,编译器不知道(此时) mpl::size<mySequence>::type确实是一种类型。此时,它不知道mySequence是什么,也不知道如何为mySequence指定mpl::size。默认情况下,它假定为,它不是类型。所以你得暗示一下。
现在您可能已经理解了为什么type::type::value可以正常工作,默认情况下,您认为value不是一种类型,您没有尝试将它作为一种类型使用,编译器也很高兴。顺便说一句,如果要将value定义为特定专门化的类型,那么如果使用此专门化,就会有一个有趣的编译错误!
https://stackoverflow.com/questions/36159731
复制相似问题