以下代码给出了错误(在我定义测试时):
错误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>;
};
答案 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)