3

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

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

什么地方出了错?

4

1 回答 1

7

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

您的代码可能有问题,也可能没有。仅凭此输出无法判断。可以肯定的是编译器不支持它,因此您可能想要更改它。

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

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

通过绕过自动推导,您可能能够克服编译器错误。


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

于 2012-10-23T11:12:09.870 回答