2010-05-28 89 views
13

我在与模板和相关类型的麻烦:麻烦与依赖类型的模板

namespace Utils 
{ 
    void PrintLine(const string& line, int tabLevel = 0); 
    string getTabs(int tabLevel); 

    template<class result_t, class Predicate> 
    set<result_t> findAll_if(typename set<result_t>::iterator begin, set<result_t>::iterator end, Predicate pred) // warning C4346 
    { 
     set<result_t> result; 
     return findAll_if_rec(begin, end, pred, result); 
    } 
} 

namespace detail 
{ 
    template<class result_t, class Predicate> 
    set<result_t> findAll_if_rec(set<result_t>::iterator begin, set<result_t>::iterator end, Predicate pred, set<result_t> result) 
    { 
     typename set<result_t>::iterator nextResultElem = find_if(begin, end, pred); 
     if (nextResultElem == end) 
     { 
      return result; 
     } 
     result.add(*nextResultElem); 

     return findAll_if_rec(++nextResultElem, end, pred, result); 
    } 
} 

编译器的投诉,从位置上面提到的:

warning C4346: 'std::set<result_t>::iterator' : dependent name is not a type. prefix with 'typename' to indicate a type 
error C2061: syntax error : identifier 'iterator' 

我在做什么错?

+1

在VS2017中,现在是C7510。 – 2018-02-15 08:59:01

回答

27

好了,警告说:

从属名称不是一个类型。前缀“类型名称”指示类型

从属名称(即,在该std::set<result_t>::iteratoriterator)不是一个类型。您需要typename前缀它指示类型:

typename std::set<result_t>::iterator 

所以,你的声明应该是:

template<class result_t, class Predicate> 
set<result_t> findAll_if(typename set<result_t>::iterator begin, typename set<result_t>::iterator end, Predicate pred) 
               note added typename^

(和定义应符合申报)

4

你需要额外的typename关键字在这一行:

set<result_t> findAll_if(typename set<result_t>::iterator begin,typenameset<result_t>::iterator end, Predicate pred) // warning C4346