首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost MPL类型Vs模板

Boost MPL类型Vs模板
EN

Stack Overflow用户
提问于 2016-03-22 16:16:32
回答 1查看 125关注 0票数 0

我对于增强MPL (和一般的元编程)来说还是很新的,我想我对模板和类型的概念感到困惑。我使用的一个简单例子是试图计算向量的长度。以下内容编译得很好:

代码语言:javascript
复制
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”,如下所示:

代码语言:javascript
复制
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“不是类型名称”。

这是因为模板参数在嵌套的命名空间中而没有推导的情况吗?使我更加困惑的是,以下是编译:

代码语言:javascript
复制
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”呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-22 16:21:29

出现此错误的原因是需要像这样使用typename (在内部apply中):

代码语言:javascript
复制
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定义为特定专门化的类型,那么如果使用此专门化,就会有一个有趣的编译错误!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36159731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档