如何使用auto和decltype关键字来简化模板参数推导?

时间:2012-10-23 10:46:51

标签: c++ templates gcc c++11

我正在实施合并排序算法。问题是当我尝试在算法中使用自动推导类型的向量时。

template <typename TIterator, typename TCompare>
void mergeSort(TIterator begin, TIterator end, TCompare criterium)
{
     //...
     auto help = *begin;                // help is a value (not a reference)
     QVector<decltype(help)> leftPart;  // now decltype(help) is also a value
     //...                              // and not a reference
}

这很有效。

但是一旦我通过常量引用使算法通过TIterators,我就会得到一个我一生中从未得到过的错误:

template <typename TIterator, typename TCompare>
void mergeSort(const TIterator& begin, const TIterator& end, TCompare criterium)
{
     //...
     auto help = *begin;                    // help is a value (not a reference)
     QVector<decltype(help)> leftPart;  // now decltype(help) is also a value
     //...
}

结果:

In function 'void mergeSort(const TIterator&, const TIterator&, TCompare)':
internal compiler error: in type_unification_real, at cp/pt.c:14176

我在g++ 4.6.3

上使用Ubuntu

出了什么问题?

1 个答案:

答案 0 :(得分:7)

只要编译器失败,就会发生内部编译器错误,这意味着您发现了一个错误。这就是早期采用新标准通常被称为流血边缘的原因:有时,它会让你流血;)

您的代码可能有问题,或者可能没有。单靠此输出是不可能的。可以肯定的是,编译器不支持它,所以你可能想要改变它。

特别是,查找std::iterator_traits<>以查看可以从迭代器类型中推断出的所有内容:

typename std::iterator_traits<TIterator>::value_type help = *begin;
                                     // ::reference
                                     // ::pointer
                                     // ...

通过规避自动扣除,您可能会遇到编译器错误。


注意:如果您希望报告错误,这肯定值得称赞,您将被要求生成一个再现该问题的预处理文件。该文件应尽可能小。它可以使用gcc命令行上的-E生成,通常以.ii扩展名结束。