3

ポインターと非ポインター用にオーバーロードされたテンプレート関数を作成しようとしています。私はこれをやった、それは動作します。

    template<class D, class V>
    bool Same(D d, V v){ return d == v; }

    template<class D, class V>
    bool Same(D* d, V v) { return *d==v;}

ここで、テンプレート化されたコンテナーがパラメーターであり、ポインターを含むコンテナー用のバージョンと、ポインター以外のコンテナー用のバージョンが必要になるように拡張したいと考えています。私はそれを理解することができません。これを試しましたが、うまくいきません。

    template< template<class> class Container, class Data, class Value>
    bool func(Container<Data> &c, Value v)
    {
        return c[0] == v;
    }

    template< template<class> class Container, class Data, class Value>
    bool func(Container<Data*> &c, Value v)
    {
            return *c[0] == v;
    }

エラー c2040 は、int* が int とは間接性のレベルが異なり、最初の関数を指していることを示しています。

どうすれば動作させることができますか?

コードの残りの部分

template<class D>
class Vec
{
    std::vector<D> m_vec;
public:
    void push_back(D d) { m_vec.push_back(d); }
        D operator[](int i) { return m_vec[i]; }
};
void test_template()
{
    Same<int, int>(2,3);
    Info i = {4};
    Same<Info, int>(i, 2);
    Info ii = {2 };
    Info *pi = &ii;
    Same<Info, int>(pi, 2);

    Vec<int> iv;
    iv.push_back(3);
    func<Vec, int, int>(iv, 3);
    Vec<int*> pv;
    pv.push_back(new int(3));
    func<Vec, int*, int>(pv, 3);
}
4

1 に答える 1