0

我编写了以下函数,它在向量中搜索并在向量中查找指针的位置,如果查找成功,则返回迭代器:

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 );

现在,当我调用 i 另一个函数时,例如:

this->findDeviceAccordingToIP("192.168.2.11");

现在我有两个问题:

  1. 当我编译它时,我收到以下错误:

    error: no matching function for call to MainCore::findDeviceAccordingToIP(const char [13])

  2. 我如何得到 return T 而只是布尔值和迭代器?

4

3 回答 3

2

关于问题1,函数模板的模板参数不依赖于函数参数,所以需要显式指定类型:

this->findDeviceAccordingToIP<SomeIteratorType>("192.168.2.11");

此外,模板代码应该在头文件中或在头文件中包含的文件中。它必须直接或间接地包含在客户端代码中。

请注意,您可以通过调用std::find_if和合适的仿函数来替换整个函数。

至于问题2,不清楚你的意思。

于 2012-08-08T12:06:08.137 回答
1

上面回答了第一个问题。

对于第二个问题:

您想要返回两种类型的值(迭代器和布尔值),这在 C++ 中是不可能的。你可以有一些可能性

使迭代器成为引用参数并在此返回结果。使返回值返回真/假,表示搜索成功。

或者

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; 
} 
于 2012-08-08T12:17:50.333 回答
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 得到向量内容的结果,它工作正常。

于 2012-08-08T14:03:36.557 回答