2012-08-08 20 views
0

我寫它的矢量搜索和查找在矢量指針的位置,如果發現是成功的,返回的迭代器的followig功能:如何在類體中調用模板函數?

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

現在我有兩個questio N:

  1. 當我編譯它,我得到以下錯誤:

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

  2. 我怎麼得到回報T和公正booloean和迭代器?

+0

它幾乎看起來像你把你的模板定義在.cpp文件中。你不能那樣做。在中聲明和定義你的模板。h – Blazes 2012-08-08 12:15:55

+1

您的代碼中無需使用模板 - 您可能需要的返回類型是'std :: vector :: iterator' – Lyth 2012-08-08 12:21:03

+0

嘗試使用std :: string而不是const char *。它更快,更高效。 – 2012-08-08 14:59:44

回答

2

關於問題1,函數模板的模板參數對功能參數無依賴性,所以你需要明確指定類型:

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

此外,模板代碼應該是頭文件或包含在頭文件中的文件。它必須由客戶代碼直接或間接包含在內。

請注意,您可以用撥打std::find_if和合適的仿函數來替換整個函數。

至於問題2,目前還不清楚你的意思。

1

第一個問題在上面回答。

對於第二個問題:

要返回兩種類型的值(iterarator和布爾值)的,這是不可能用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; 
} 
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; 
} 

,所以我得到的布爾結果和裁判得到的矢量的內容結果,它的工作精細。

+0

這樣你就不會修改函數範圍之外的'devPtr'(在調用者中)。你需要通過引用來傳遞指針:'bool MainCore :: findDeviceAccordingToIP(const std :: string&_IPAddress,Device *&devPtr)' – Lyth 2012-08-09 07:53:02

+0

但是我需要得到結果作爲布爾值。 – PersianGulf 2012-08-09 13:18:01

+0

事實上,你得到的結果是布爾值,但是由於缺少方法聲明中的&符號,所以你不會在函數外獲得'devPtr'值。 – Lyth 2012-08-09 13:59:21