C++ 声明使用模板参数的函数
我想定义一个接受模板参数的助手函数。我曾尝试为此创建一个模板函数,但它无法编译。知道我做错了什么吗?这是我试过的代码C++ 声明使用模板参数的函数,c++,templates,C++,Templates,我想定义一个接受模板参数的助手函数。我曾尝试为此创建一个模板函数,但它无法编译。知道我做错了什么吗?这是我试过的代码 // vectors are great, but lack a find method. Implement one as a helper. template<class T> bool vec_find(vector<T> &v, T obj) { vector<T>::iterator s; for (s = v
// vectors are great, but lack a find method. Implement one as a helper.
template<class T> bool vec_find(vector<T> &v, T obj)
{
vector<T>::iterator s;
for (s = v.begin(); s < v.end(); s++)
{
if (*s == obj)
{
return true;
}
}
return false;
}
//向量很好,但缺少find方法。实现一个作为助手。
模板布尔向量查找(向量&v,T对象)
{
向量::迭代器s;
对于(s=v.begin();s
大概是编译器告诉了您问题所在。我的朋友说:
test.cpp:7:5: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope
通常,只要类型名称的范围依赖于模板参数,就需要这样做;在模板被实例化之前,编译器不知道如何定义vector
,因此需要被告知在模板内的名称范围是指一个类型,而不是其他类型
<>但是,有一个很好的原因,为什么<代码>向量<代码>没有<代码>查找< /> >方法:C++库将容器与作用于它们的算法分开,从而任何算法都可以按任何合适的顺序运行。您要使用std::find
来执行以下操作:
return std::find(v.begin(), v.end(), obj) != v.end();
你的编译器大概告诉了你问题所在。我的朋友说:
test.cpp:7:5: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope
通常,只要类型名称的范围依赖于模板参数,就需要这样做;在模板被实例化之前,编译器不知道如何定义vector
,因此需要被告知在模板内的名称范围是指一个类型,而不是其他类型
<>但是,有一个很好的原因,为什么<代码>向量<代码>没有<代码>查找< /> >方法:C++库将容器与作用于它们的算法分开,从而任何算法都可以按任何合适的顺序运行。您要使用std::find
来执行以下操作:
return std::find(v.begin(), v.end(), obj) != v.end();
你把它放在头文件里了吗?编译器错误是什么?使用
std::find
。我想在vector::iterator
之前需要一个typename
。此外,决不能将s
与迭代器一起使用。对于存储连续的向量,它可能工作得很好,但当您移动到类似于std::list
的位置时,您将得到意外的结果。更好的是,您可以使用ranged for或std::for each
。或者,在对向量进行排序时,您可以使用std::binary\u search
。可能的重复项您是否将其放在头文件中?编译器错误是什么?使用std::find
。我想在vector::iterator
之前需要一个typename
。此外,决不能将s
与迭代器一起使用。对于存储连续的向量,它可能工作得很好,但当您移动到类似于std::list
的位置时,您将得到意外的结果。更好的是,你可以使用ranged for或std::for each
。或者你可以在向量排序时使用std::binary\u search
。可能是重复的我刚刚意识到OP从未说过问题在函数头中。不管出于什么原因,我想他们会的:汉克斯!std::find()是一个很好的解决方案。我刚刚意识到OP从未说过问题出在函数头中。不管出于什么原因,我想他们会的:汉克斯!std::find()是一个很好的解决方案。