Trouble with dependent types in templates
24,478
Solution 1
Well, the warning says:
dependent name is not a type. prefix with 'typename' to indicate a type
The dependent name (that is, the iterator
in std::set<result_t>::iterator
) is not a type. You need to prefix it with typename
to indicate a type:
typename std::set<result_t>::iterator
So, your declaration should be:
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 ^
(and the definition should match the declaration)
Solution 2
You need an additional typename keyword on this line:
set<result_t> findAll_if(typename set<result_t>::iterator begin,
typenameset<result_t>::iterator end, Predicate pred) // warning C4346
Author by
Nick Heiner
JS enthusiast by day, horse mask enthusiast by night. Talks I've Done
Updated on July 30, 2022Comments
-
Nick Heiner almost 2 years
I'm having trouble with templates and dependent types:
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); } }
Compiler complaints, from the location noted above:
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'
What am I doing wrong?