我编写了followig函数,它在向量中搜索并在向量中找到指针的位置,如果find成功,则返回迭代器:
template<class InputIterator>
InputIterator MainCore::findDeviceAccordingToIP ( const char * value )
{
std::vector<Device *>::iterator first,last;
first = this->devList->begin();
last = this->devList->end();
Device *temp;
for ( ;first!=last; first++){
temp = *first;
if ( strcmp(temp->endpoint->IPAddress.c_str(),value) == 0)
{
return first;
break;
}
}
//return false;
}
我在cpp文件中的上面代码中将以下代码放在* .h文件中的MainCore类中:
template<class InputIterator>
InputIterator findDeviceAccordingToIP (const char *value );
现在我打电话给另一个功能,如:
this->findDeviceAccordingToIP("192.168.2.11");
现在我有两个问题:
当我编译它时,我收到以下错误:
error: no matching function for call to MainCore::findDeviceAccordingToIP(const char [13])
我如何获得返回T并且只是booloean和迭代器?
答案 0 :(得分:2)
关于问题1,函数模板的模板参数不依赖于函数参数,因此需要明确指定类型:
this->findDeviceAccordingToIP<SomeIteratorType>("192.168.2.11");
此外,模板代码应位于头文件或头文件所包含的文件中。它必须由客户端代码直接或间接包含在内。
请注意,您可以通过调用std::find_if和合适的函子来替换整个函数。
关于问题2,目前尚不清楚你的意思。
答案 1 :(得分:1)
上面回答了第一个问题。
关于第二个问题:
您希望返回两种类型的值(iterarator和boolean),这是C ++无法实现的。你可以有一些可能性
使迭代器成为引用参数并返回结果。使返回值返回true / false以指示搜索是否成功。
OR
如果找不到值,请返回last
。这可以很容易地编码。
template<class InputIterator> InputIterator MainCore::findDeviceAccordingToIP ( const char * value )
{
std::vector<Device *>::iterator first,last;
first = this->devList->begin();
last = this->devList->end();
Device *temp;
for ( ;first!=last; first++)
{
temp = *first;
if ( strcmp(temp->endpoint->IPAddress.c_str(),value) == 0)
{
break;
}
}
return first;
}
答案 2 :(得分:0)
我将其更改为以下函数,而不是迭代器,我将迭代器的内容作为Device *
传递:
bool MainCore::findDeviceAccordingToIP (const std::string& _IPAddress, Device * devPtr )
{
std::vector<Device *>::iterator first,last;
first = this->devList.begin();
last = this->devList.end();
Device *temp;
for ( ;first!=last; first++){
temp = *first;
if ( temp->endpoint->IPAddress == _IPAddress )
{
devPtr = *first;
return true;
}
}
return false;
}
所以我得到了布尔结果,并通过ref获得向量内容的结果,它的工作正常。