Nic*_*ner 16 c++ syntax templates stl
我遇到模板和依赖类型的问题:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器投诉,来自上述位置:
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'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Jam*_*lis 34
嗯,警告说:
依赖名称不是类型.带有'typename'的前缀表示类型
从属名称(即iteratorin std::set<result_t>::iterator)不是类型.您需要在其前面加上typename以指示类型:
typename std::set<result_t>::iterator
Run Code Online (Sandbox Code Playgroud)
所以,你的声明应该是:
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 ^
Run Code Online (Sandbox Code Playgroud)
(并且定义应与声明相符)
您需要在此行中添加其他typename关键字:
set<result_t> findAll_if(typename set<result_t>::iterator begin,类型名set<result_t>::iterator end, Predicate pred) // warning C4346