为容器内保存的指针和非指针类型数据创建模板函数重载

时间:2013-07-24 19:58:17

标签: c++ templates

我正在尝试创建一个为指针和非指针重载的模板函数。我做到了这一点并且有效。

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

1 个答案:

答案 0 :(得分:3)

对于func的第二次调用,第二个模板参数应为int,而不是int *。否则,第二个func declaratino将查找Vec<int **>作为第一个模板参数(因为它有自己的指针)。

func<Vec, int, int>(pv, 3);
DyP提到的

编辑:,您也可以完全省略模板参数,因为编译器应该能够从实际的函数参数中推断出它们。