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

今、次のような別の関数を呼び出すと:

this->findDeviceAccordingToIP("192.168.2.11");

今、私は2つの質問があります:

  1. コンパイルすると、次のエラーが発生します。

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

  2. どのようにリターンTを取得し、ブール値とイテレータのみを取得しますか?

4

3 に答える 3

2

質問 1 に関しては、関数テンプレートのテンプレート パラメーターは関数パラメーターに依存しないため、型を明示的に指定する必要があります。

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

さらに、テンプレート コードは、ヘッダー ファイルまたはヘッダーによってインクルードされるファイルにある必要があります。これは、クライアント コードによって直接的または間接的に含める必要があります。

関数全体をstd::find_ifの呼び出しと適切なファンクターに置き換えることができることに注意してください。

質問2に関しては、あなたが何を意味するのか明確ではありません。

于 2012-08-08T12:06:08.137 に答える
1

最初の質問は上記で回答されています。

2 番目の質問:

C++ では不可能な 2 種類の値 (反復子とブール値) を返したいとします。あなたはいくつかの可能性を持つことができます

イテレータを参照パラメータにして、これで結果を返します。検索の成功を示すために、戻り値が true/false を返すようにします。

また

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

だから私はブール値の結果を取得し、参照によってベクトルの内容の結果を取得すると、正常に動作します。

于 2012-08-08T14:03:36.557 に答える