首页 > 解决方案 > C++中表达式的命名类型

问题描述

这里的 typename 表达式不起作用。编译器说:

“在 '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。有任何想法吗?

标签: c++templatestype-alias

解决方案


正确的方法是:

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;

编译为表达式,但导致了一些其他编译错误,可能是因为元素类型是一些不应该的引用或类似的东西。


推荐阅读