2012-10-23 38 views
3

我正在實施合併排序算法。問題是當我嘗試在算法中使用自動演繹類型的向量時。如何使用auto和decltype關鍵字來簡化模板參數推演?

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.3Ubuntu

出了什麼問題?

+1

「內部編譯器錯誤」:看起來像一個編譯器錯誤給我,說實話 – Jasper

+0

你不應該用'常量汽車&'在這種情況下? –

+0

@LyubomirVasilev其實我想幫助是一個值,而不是一個參考,以便能夠申報同一類型的QVector爲幫助 –

回答

7

只要編譯器失敗,就會發生內部編譯器錯誤,這意味着您發現了一個錯誤。這是同時儘早採用新的標準通常被稱爲前沿的原因:有時,它使你流血;

有可能是壞了你的代碼),或者可能不存在。單從這個輸出是不可能的。可以肯定的是編譯器不支持它,所以你可能想改變它。

特別,查找std::iterator_traits<>看到所有你可以從一個迭代器的類型推斷的東西:

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

通過避免使用自動扣除,你可能能夠得到過去的編譯器錯誤。


注意:如果要報告錯誤,這當然是值得稱道的,你會被要求出示預處理文件複製的問題。這個文件應該儘可能小。它可以在gcc命令行上使用-E生成並且通常與.ii延伸結束。

+0

謝謝!使用iterator_traits代替工作。它編譯並通過了單元測試。 –

+1

你是否需要幫助? QVector :: value_type>有什麼問題? – CashCow

+1

@CashCow:缺少'typename';)否則,不知道,因爲我看不到算法的其餘的我不知道是否help''後來被使用。 –