0

我有一个通用列表容器,它的函数 find 定义如下:

template <class T>
typename List<T>::Iterator List<T>:: find(void * f, T data) {
    Iterator iterator;
    for (iterator = begin() ; iterator != end() ; iterator++) {
        if (f(*iterator, data)) {
            break;
        }
    }
    return iterator;
}

所以它需要一个函数 f 和一个 T 类型的实例,然后迭代列表中的节点,其节点“包含”一个 T 类型的实例,直到其中一个导致 f(*iterator,data) 评估为真。迭代器的取消引用运算符返回节点中的数据,因此迭代器和数据的类型将相同。

我正在尝试传递一个检查对象是否在列表中的函数:

template <class T>
bool findByUnique(T compare, T data) {
    if (compare == data) {
        return true;
    }
    else {
        return false;
    }
}

我试图按如下方式传递函数,但得到错误:

store.cpp:28:14: error: cannot resolve overloaded function âfindByUniqueâ based on conversion to type âvoid*â
store.cpp:29:56: error: expected primary-expression before â>â token
store.cpp:29:60: error: left operand of comma operator has no effect [-Werror=unused-value]

第 27-29 行(传递函数):

Album album(barcode,price,year,numPurchased,title,artist);
void * f = &findByUnique<Album>;
List<Album>::Iterator found = this->Albums->find<Album>(f,album);

我在这里做错了什么?在谷歌上搜索表明我必须将 static_cast 应用于 findByUnique 但我不确定它如何应用在这里。

谢谢。

4

1 回答 1

0

@Taylor Flores 是对的。您没有在 find 或变量 f 的声明中正确声明函数指针。参见(例如):

http://www.cprogramming.com/tutorial/function-pointers.html

于 2013-06-26T18:50:18.043 回答