模糊调用 - 模板功能

问题描述 投票:0回答:1

我一直想刷刷C++知识,发现这个问题我不能轻易Google。

我写了一个函数,其签名如下。

template <typename Iterator>
Iterator lower_bound(
    Iterator left,
    Iterator right,
    typename Iterator::value_type const& target
) {
    //stuff happens here
}

我想这样使用它。

std::vector<int> odd{1, 2, 3, 4, 5, 6, 7};
int i = 4;
std::cout << std::distance(odd.begin(), lower_bound(odd.begin(), odd.end(), i)) << std::endl;

我得到以下编译错误: error: call to 'lower_bound' is ambiguous.

我猜测我对模板类型是如何解决的缺乏一些了解,所以将感激任何资源,可能会更详细地解释这个问题。

c++ templates
1个回答
2
投票

在这里。std::lower_bound 是造成歧义的原因。由于 依赖于参数的查询 你的函数以及标准版本都在附近。

如果你使用自己的(非std)迭代器类型,那么你将不会面临任何问题。请看下面的例子 (现场演示):

#include <vector>
#include <iostream>

template <class T>
struct myIter {
    using value_type = T;
    myIter(T* const ptr) : ptr(ptr) {};
    T& operator*() {return *ptr;};
    T* ptr;
};

template <typename Iterator>
Iterator lower_bound(
    Iterator left,
    Iterator right,
    typename Iterator::value_type const& target) 
{
    return left;
}

int main()
{
std::vector<int> odd{1, 2, 3, 4, 5, 6, 7};
myIter<int> b(&(odd.front())), e(&(odd.back()));

int i = 4;
std::cout << *(lower_bound(b,e, i)) << std::endl; // <- works
// std::cout << *(lower_bound(odd.begin(),odd.end(), i)) << std::endl; // <- compiler error
}
© www.soinside.com 2019 - 2024. All rights reserved.