在C ++中将模板函数作为参数传递

时间:2013-06-26 18:45:00

标签: c++ templates function-pointers

我有一个通用列表容器,其函数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)计算为true 。 迭代器的解引用运算符返回节点中的数据,因此迭代器和数据的类型将是相同的。

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

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);

我在这里做错了什么? 在Google上搜索表示我必须将static_cast应用于findByUnique,但我不确定它是如何应用的。

感谢。

1 个答案:

答案 0 :(得分:0)

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

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