【问题标题】:template alias in specialized class专门类中的模板别名
【发布时间】:2015-10-26 11:36:39
【问题描述】:

以下代码给出了错误(在我定义测试的行中):

错误 C2143:语法错误:缺少 ';'在'

有人知道为什么会这样吗? 编译器是VC2015 CTP1。

编辑:错误必须发生在模板解析的阶段1,因为即使我从未实例化类Produce也会发生。

namespace OrderPolicy
{
    struct Unordered {};
    struct Ordered {};
};

template <typename TOrderPolicy>
struct OrderManager {};

template<>
struct OrderManager<OrderPolicy::Unordered>
{
    template <typename TItem>
    using item_t = TItem;
};

template<>
struct OrderManager<OrderPolicy::Ordered> 
{
    template <typename TItem>
    using item_t = TItem*;
};

template<typename TOrderPolicy>
struct Produce : public OrderManager<TOrderPolicy>
{
    item_t<int> test;
    //using item_type = item_t<int>;
};

Edit2:当我将代码的最后一部分更改为时它可以工作

struct Produce : public OrderManager<OrderPolicy::Ordered>
{
    item_t<int> test;
    //using item_type = item_t<int>;
};

【问题讨论】:

    标签: c++ c++11 visual-c++


    【解决方案1】:
    item_t<int> test;
    

    从基类中命名一个依赖模板类型。在这种情况下,您需要告诉编译器item_t 是您的基类中的一个类型,并且它是一个模板。

    直接的方法是使用typename and template:

    typename OrderManager<TOrderPolicy>::template item_t<int> test;
    

    如您所见,这将很快变得不可读。我会制作一些本地别名以使代码更整洁:

    using Base = OrderManager<TOrderPolicy>;
    using item_type = typename Base::template item_t<int>;
    item_type test;
    

    【讨论】:

      【解决方案2】:

      你必须使用:

      typename OrderManager<TOrderPolicy>::template item_t<int>
      

      代替:

      item_t<int> test;
      

      【讨论】:

      • “类型别名不是从基类中导入的”,为什么?我认为问题是基类是一个依赖的,所以没有在那里查找名称
      • 是的,我查过了。别名确实是导入的,它只需要知道它是一个模板。
      【解决方案3】:

      哇,学习永无止境。直到现在我还没有看到在这个上下文中使用的关键字模板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        相关资源
        最近更新 更多