【问题标题】:"undefined reference to std::_Rb_tree_const_iterator" when returning iterator返回迭代器时“对 std::_Rb_tree_const_iterator 的未定义引用”
【发布时间】:2013-06-18 13:27:52
【问题描述】:

我正在尝试实现一个简单的 std::find_if() 类函数来使用(我不允许在我的作业中使用它)。

这是我的实现:

template<class Iterator, class Function>
Iterator setFindIf(Iterator first, Iterator end, Function predicate) {
    for (Iterator iterator = first; iterator != end; ++iterator) {
        if (predicate(*iterator)) {
            return iterator;
        }
    }
    return end;
}

这是调用 setFindIf() 的行:

if (setFindIf(orders.begin(), orders.end(),
            orderCustomerHasOpenOrder(id, ordNum)) != orders.end()) {

这是错误:

undefined reference to `std::_Rb_tree_const_iterator<Order> setFindIf<std::_Rb_tree_const_iterator<Order>, orderCustomerHasOpenOrder>(std::_Rb_tree_const_iterator<Order>, std::_Rb_tree_const_iterator<Order>, orderCustomerHasOpenOrder)'

感谢帮助。

【问题讨论】:

  • 我的猜测是您已将模板实现放在源文件中,并试图从不同的源文件中调用它。 You can't do that;通常,您需要在标题中定义模板。

标签: c++ templates stl iterator set


【解决方案1】:

看起来你在标题中声明了模板:

template<class Iterator, class Function>
Iterator setFindIf(Iterator first, Iterator end, Function predicate);

然后将实现放在一个 .cpp 文件中,并从不同的 .cpp 文件中调用它。它不适用于模板。

迈克首先给出了答案,但他发表了评论,所以我还是发布了这个。

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 2020-04-28
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多