C++ 查找项目功能模板给我带来的问题
我试图在一个范围内找到一个项,因此我对名为“find”的模板函数进行了多个测试C++ 查找项目功能模板给我带来的问题,c++,templates,pointers,syntax-error,function-templates,C++,Templates,Pointers,Syntax Error,Function Templates,我试图在一个范围内找到一个项,因此我对名为“find”的模板函数进行了多个测试 模板T*find(T*left,T*end,T项); 这就是我正在使用的功能原型,它无法与我的第一个测试一起工作,即: static void TestFind1(void) { cout << "***** Find1 *****" << endl; const int i1[] = {-1, 2, 6, -1, 9, 5, 7, -1, -1, 8, -1}; int si
模板T*find(T*left,T*end,T项);
这就是我正在使用的功能原型,它无法与我的第一个测试一起工作,即:
static void TestFind1(void)
{
cout << "***** Find1 *****" << endl;
const int i1[] = {-1, 2, 6, -1, 9, 5, 7, -1, -1, 8, -1};
int size = sizeof(i1) / sizeof(int);
const int *end = i1 + size;
CS170::display(i1, end);
const int item = 9;
const int *pos = CS170::find(i1, end, item);
if (pos != end)
cout << "Item " << item << " is " << *pos << endl;
else
cout << "Item " << item << " was not found" << endl;
}
静态void TestFind1(void)
{
cout考虑到您正在尝试将const int[]
和const int*
作为参数传递给模板方法调用,并且模板实例化不考虑隐式转换,模板函数签名应为:
template <typename T>
const T* find(const T *left, const T *end, const T& item);
模板
常数T*查找(常数T*左、常数T*结束、常数T&项);
e、 g:
模板
常量T*查找(常量T*左、常量T*结束、常量T&项){
while(左!=结束){
如果(项目==*左){
左转;
}
++左;
}
返回端;
}
或者,您可以将客户端代码更改为使用非常量int[]
和int*
参数,并且其中一个函数模板签名应该可以工作
但是,您不使用std::find
有什么原因吗?您正在传递一个类型为const int[11]
的值作为T*left
参数。在普通(非模板)函数中,这可以作为const int[11]
可以隐式转换为const int*
,但由于find
是一个模板,因此不考虑隐式转换。隐式转换在重载解析期间考虑,但模板实例化发生在重载解析之前
您可以这样强制转换:
const int *pos = CS170::find(static_cast<const int*>(i1), end, item);
const int *pos = CS170::find(i1 + 0, end, item);
这是创建我们自己的向量库的任务。您的模板可以工作,但我在find下运行了多个测试用例,因此我不能在每个参数类型之前定义const。第二个测试使用除项以外的所有内容作为int。因此,请发布您的代码应该通过的所有测试,而不仅仅是一个测试。
template <typename T>
const T* find(const T *left, const T *end, const T& item) {
while (left != end) {
if (item == *left) {
return left;
}
++left;
}
return end;
}
const int *pos = CS170::find(static_cast<const int*>(i1), end, item);
const int *pos = CS170::find(i1 + 0, end, item);