如何在类体中调用模板函数?

时间:2012-08-08 12:01:26

标签: c++ templates stl vector iterator

我编写了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");

现在我有两个问题:

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

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

  2. 我如何获得返回T并且只是booloean和迭代器?

3 个答案:

答案 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获得向量内容的结果,它的工作正常。