小编Eit*_*tan的帖子

C++仿函数和模板:错误:'class List <T>'的声明

我在一个名为List :: find()的方法的模板类中有一个嵌套模板.这个方法得到一个函子作为输入,它是:"函数条件".

template<class T>
class List {
....
template<class Function>
Iterator find(Function condition) const;
....
};

template<class T, class Function>
typename List<T>::Iterator List<T>::find(Function condition) const {
   List<int>::Iterator it = this->begin();
   for (; it != this->end(); ++it) {
   if (condition(*it)) {
       break;
   }
   }
   return it;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

..\list.h:108:62: error: invalid use of incomplete type 'class List<T>'
..\list.h:16:7: error: declaration of 'class List<T>'
Run Code Online (Sandbox Code Playgroud)

我该如何引用List?为什么声明不正确?

编辑:

现在改为:

template<class T>
template<class Function>
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

..\list.h:111:30: error: no match for 'operator++' in '++it'
..\list.h:112:18: …
Run Code Online (Sandbox Code Playgroud)

c++ templates nested functor c++11

4
推荐指数
1
解决办法
2094
查看次数

从std :: find_if这样的方法返回的迭代器与常规迭代器不匹配

我有这个std :: find_if()方法返回找到的迭代器(匹配"条件"仿函数).

template<class T, class Function>
typename std::set<T>::iterator setFindIf(set<T> set, Function condition) {
    typename std::set<T>::iterator iterator = set.begin();
    for (; iterator != set.end(); iterator++) {
        cout<<"U";
        if (condition(*iterator)) {
            break;
        }
    }
    return iterator;
}
Run Code Online (Sandbox Code Playgroud)

这条线称之为:

std::set<Order>::iterator it = setFindIf(orders, orderCustomerHasOpenOrder(id, ordNum));
Run Code Online (Sandbox Code Playgroud)

我正在测试一个空集,所以这一行(在上面的行之后)应该打印'1':

cout<<(it==orders.end());
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?当我在setFindIf()方法的末尾添加这一行时,它会按预期打印"1".

c++ stl set

0
推荐指数
1
解决办法
323
查看次数

标签 统计

c++ ×2

c++11 ×1

functor ×1

nested ×1

set ×1

stl ×1

templates ×1