我正在实施合并排序算法。问题是当我尝试在算法中使用自动推导类型的向量时。
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
出了什么问题?
答案 0 :(得分:7)
只要编译器失败,就会发生内部编译器错误,这意味着您发现了一个错误。这就是早期采用新标准通常被称为流血边缘的原因:有时,它会让你流血;)
您的代码可能有问题,或者可能没有。单靠此输出是不可能的。可以肯定的是,编译器不支持它,所以你可能想要改变它。
特别是,查找std::iterator_traits<>
以查看可以从迭代器类型中推断出的所有内容:
typename std::iterator_traits<TIterator>::value_type help = *begin;
// ::reference
// ::pointer
// ...
通过规避自动扣除,您可能会遇到编译器错误。
注意:如果您希望报告错误,这肯定值得称赞,您将被要求生成一个再现该问题的预处理文件。该文件应尽可能小。它可以使用gcc命令行上的-E
生成,通常以.ii
扩展名结束。