2014-05-09 69 views
0

我正在構建一個簡單的文本分析器。我有以下代碼:錯誤:模板參數數量錯誤(0,應該是1)

template<typename FwdIt0, typename FwdIt1, typename Comp, typename Num> 
Num SmartAnalyzer::count_intersection(FwdIt0 beg0, FwdIt0 end0, FwdIt1 beg1, FwdIt1 end1, Comp less, Num n) 
{ 
    while (beg0 != end0 && beg1 != end1) 
    { 
     if (less(*beg0, *beg1)) ++beg0; 
     else if (less(*beg1, *beg0)) ++beg1; 
     else 
     { 
      ++n; 
      ++beg0; 
      ++beg1; 
     } 
    } 

    return n; 
} 

// Finds intersection between 2 sentences and divide it to the average sentence length 
template<typename FwdIt0, typename FwdIt1> 
double SmartAnalyzer::intersection_weight(FwdIt0 beg0, FwdIt0 end0, FwdIt1 beg1, FwdIt1 end1) 
{ 
    double const mid_size = 0.5 * (std::distance(beg0, end0) + std::distance(beg1, end1)); 
    /* LINE 38 */ double const intsc = count_intersection(beg0, end0, beg1, end1, std::less<>(), double()); 
    return intsc/mid_size; 
} 

當我嘗試編譯它,我越來越:

../lib/analyzer.cpp: In member function ‘double SmartAnalyzer::intersection_weight(FwdIt0, FwdIt0, FwdIt1, FwdIt1)’ : 
../lib/analyzer.cpp : 38 : 76 : error : wrong number of template arguments(0, should be 1) 

隨着GCC 4.7 on Debian。我認爲這與GCC有某種關係,直到4.7+不支持模板別名,但我不知道如何修復它。我沒有機會將gcc更新到4.8。

+0

請向我們展示analyzer.cpp中使用模板並嘗試實例化的第38行。 – jsantander

+0

可能的重複http://stackoverflow.com/questions/7721244/c-template-function-specialization-wrong-number-of-template-arguments和http://stackoverflow.com/questions/22097240/c-wrong-number -of-template-arguments-2-should-be-1 – Rakib

+0

@jsantander我編輯了我的問題 – Deepsy

回答

1

,我(GCC 4.8)這一個工作

正如我在評論所指出的,問題是你失蹤了std::less模板參數(請注意,它似乎在C++ 14少得到了specialization for void parameter

我添加了一個新的模板參數X

#include <functional> 
#include <iterator> 
#include <vector> 

template<typename FwdIt0, typename FwdIt1, typename Comp, typename Num> 
Num count_intersection(FwdIt0 beg0, FwdIt0 end0, FwdIt1 beg1, FwdIt1 end1, Comp less, Num n) 
{ 
    while (beg0 != end0 && beg1 != end1) 
    { 
     if (less(*beg0, *beg1)) ++beg0; 
     else if (less(*beg1, *beg0)) ++beg1; 
     else 
     { 
      ++n; 
      ++beg0; 
      ++beg1; 
     } 
    } 

    return n; 
} 

// Finds intersection between 2 sentences and divide it to the average sentence length 
template<typename FwdIt0, typename FwdIt1,typename X> 
double intersection_weight(FwdIt0 beg0, FwdIt0 end0, FwdIt1 beg1, FwdIt1 end1) 
{ 
    double const mid_size = 0.5 * (std::distance(beg0, end0) + std::distance(beg1, end1)); 
    /* LINE 38 */ double const intsc = count_intersection(beg0, end0, beg1, end1, std::less<X>(), double()); 
    return intsc/mid_size; 
} 


int main() { 
    std::vector<int> a; 
    std::vector<int> b; 


    intersection_weight<std::vector<int>::iterator,std::vector<int>::iterator,int>(a.begin(),a.end(),b.begin(),b.end());   
} 
1

std::less類型必須提供。但它不適用於異構類型(它將在C++ 14中)。所以在你的情況下,FwdIt0FWdIt1都不能有不同的value_type

也許你可以試試下面的(當上述觀點將得到解決):

template<typename FwdIt0, typename FwdIt1> 
double SmartAnalyzer::intersection_weight(FwdIt0 beg0, FwdIt0 end0, FwdIt1 beg1, FwdIt1 end1) 
{ 

    typedef std::iterator_traits<FwdIt0>::value_type less_type; 
    double const mid_size = 0.5 * (std::distance(beg0, end0) + std::distance(beg1, end1)); 
    /* LINE 38 */ double const intsc = count_intersection(beg0, end0, beg1, end1, std::less<less_type>(), double()); 
    return intsc/mid_size; 
} 
相關問題