专门课程

时间:2015-10-26 11:36:39

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

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

  

错误C2143:语法错误:缺少';'在'<'之前   注意:请参阅正在编译的类模板实例化'ptc :: Produce'的引用   错误C4430:缺少类型说明符 - 假定为int。   注意:C ++不支持default-int

有人知道为什么会这样吗? 编译器是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>;
};

3 个答案:

答案 0 :(得分:2)

您必须使用:

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

取代:

item_t<int> test;

答案 1 :(得分:2)

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 :(得分:0)

哇,学习永远不会停止。到目前为止,我没有看到在此上下文中使用的关键字模板。