0

がオーバーロードされた場合structにのみ有効な使用法を持つようにテンプレートを作成しました。そうしないと、コンパイラ エラーが発生します。classbool operator==

namespace atn {
    template <typename T>
    bool find( std::vector<T>& cont, T find ) {
        for( std::vector<T>::iterator it = cont.begin(); it != cont.end(); ++it ) {
            if( (*it) == find )
                return true;
        }
        return false;
    }
};

たとえば、次のようにします。

struct sPlayer {
    u_int idPlayer;
    sPlayer() : idPlayer(0) {};
    bool operator==( const sPlayer& ref ) const {
        return ref.idPlayer == this->idPlayer;
    };
};

int _tmain(int argc, _TCHAR* argv[]) {
    std::vector<sPlayer>a;
    sPlayer player;
    player.idPlayer = 5;
    a.push_back(player);
    if(atn::find(a, player)){
        std::cout << "Found" << std::endl;
    }
    return 0;
}

問題は、次のように使用する場合です。

vector<int>hold;
if(atn::find(hold, 4))

この部分で迷子になりました。テンプレートは、vector<T>渡された 2 番目のパラメーターの値によって割り当てられる T の型を想定していますか? または、渡されたベクトル参照のタイプから推測しますか?

4

2 に答える 2

2

両方の引数が一致する必要があります。テンプレート引数の推定では、関数の引数の型が指定された引数の型と一致するように、各テンプレート引数の型を見つけようとします。

時々これは少しトリッキーになります、そしてうまくいくはずのものはうまくいきません。例えば:

std::vector<int> v;
atn::find(v, 1U);

T = int最初の引数はを推定したいのですが、2番目の引数はを望んでいるため、これは失敗しますT = unsigned int。推論は失敗し、コードはコンパイルされません。(これが問題である場合、解決策は、1つを除くすべての関数の引数を推論しないようにすることです。)

于 2012-10-17T02:30:30.770 に答える
2

テンプレートは、渡された2番目のパラメーターの値によってベクトルで割り当てられるTのタイプを想定していますか?または、渡されたベクトル参照のタイプから想定しますか?

ない。コンパイラーは、各引数の型を個別に推測し、推測された型がすべての場合で同じであることを確認します。推論された型がすべての引数で同じでない場合、コンパイルに失敗します。

この一般的な例の1つは、std::max(またはstd::min)テンプレートです。

template <typename T>
T min( T lhs, T rhs ) {
   return (lhs < rhs? lhs : rhs);
}
int main() {
   min(1,1u);  // error
}
于 2012-10-17T02:31:09.410 に答える