C ++中表达式的命名类型

时间:2018-07-30 16:24:07

标签: c++ templates type-alias

此处的类型名称表达式不起作用。 编译器说:

  

“在'typename'之后期望一个限定名称”。

template <typename Iterator, typename Predicate>
void mergeSort(Iterator start, Iterator end, Predicate lessThan)
{   typename typeid(start[0]) Element;
    [...implementation, not relevant...]
}

我试图定义一个类型名称Element,该类型名称将引用表达式start[0]的类型。 (或者通常是Iterator的元素类型。)。我正在使用C ++ 17。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

执行此操作的正确方法是:

template <typename Iterator, typename Predicate>
void mergeSort(Iterator start, Iterator end, Predicate lessThan)
{   typedef typename std::iterator_traits<Iterator>::value_type Element;
}

使用以下内容:

typedef decltype(start[0]) Element;

被编译为一个表达式,但是导致了其他一些编译错误,可能是因为元素类型是某种引用,而不应该是这种引用。