【发布时间】:2013-04-17 14:02:01
【问题描述】:
我想要一个函数模板,它接受一个向量和一个元素,并返回该元素在向量中的位置。我希望这个函数适用于 int 和 std::string 类型。这是函数模板定义:
template<class T>
int findElement(const vector<T> &vec, const T &ele)
{
for(size_t i = 0; i < vec.size(); i++)
{
if(typeid(ele) == typeid(std::string))
{
if(ele.compare(vec[i]) == 0)
return i;
}
else
{
if(ele == vec[i])
return i;
}
}
return -1;
}
如您所见,我最初是在检查类型,以便使用适当的比较方法。当我使用 std::string 类型参数调用时,这很好用,但是当我使用双精度类型时,它会给出以下错误:
error C2228: left of '.compare' must have class/struct/union
和
see reference to function template instantiation 'int findElement<double>(const std::vector<_Ty> &,const T &)' being compiled
我该如何解决这个问题?
谢谢, 拉克什。
【问题讨论】:
-
std::string 定义了 == 运算符!
-
替代搜索 -
iter = std::find(vec.begin(), vec.end(), ele);? -
另外,如果你想要两种不同的行为 - 只需编写两个不同的函数。 :-)
-
顺便说一句,您不应该真正使用
int作为通用实用程序代码中向量的大小。有人可以在 64 位机器上创建一个大于INT_MAX的向量。