模棱两可的调用模板函数 我一直在努力提高我的C++知识,发现这个问题我很难谷歌。< /P>

模棱两可的调用模板函数 我一直在努力提高我的C++知识,发现这个问题我很难谷歌。< /P>,c++,templates,C++,Templates,我编写了一个具有以下签名的函数: 模板 迭代器下界( 迭代器左, 迭代器权限, 类型名迭代器::值\类型常量和目标 ) { //这里发生了很多事情 } 我试着这样使用它: std::向量奇数{1,2,3,4,5,6,7}; int i=4; std::cout这里,std::lower_bound引起了歧义。由于您的功能以及std版本的存在 如果使用自己的(非std)迭代器类型,则不会遇到任何问题。请参见下面的示例(): #包括 #包括 模板 结构密特{ 使用值_type=T; myIter(

我编写了一个具有以下签名的函数:

模板
迭代器下界(
迭代器左,
迭代器权限,
类型名迭代器::值\类型常量和目标
) {
//这里发生了很多事情
}
我试着这样使用它:

std::向量奇数{1,2,3,4,5,6,7};
int i=4;

std::cout这里,
std::lower_bound
引起了歧义。由于您的功能以及std版本的存在

如果使用自己的(非
std
)迭代器类型,则不会遇到任何问题。请参见下面的示例():

#包括
#包括
模板
结构密特{
使用值_type=T;
myIter(T*constptr):ptr(ptr){};
T&运算符*(){return*ptr;};
T*ptr;
};
模板
迭代器下界(
迭代器左,
迭代器权限,
类型名迭代器::值(类型常量和目标)
{
左转;
}
int main()
{
向量奇数{1,2,3,4,5,6,7};
myIter b(&(奇数前())、e(&(奇数后());
int i=4;

std::cout谢谢。我不会想到这一点的。在这里,为了子孙后代,将我的
下界
方法嵌套在命名空间中也可以避免这个问题。是的,使用命名空间也很好。
#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
}