使用模板类作为参数

时间:2009-06-14 04:55:09

标签: c++ templates

有没有办法创建一个接受任何给定版本的函数 模板类?

e.g。这有效:

ostream& operator << (ostream &out,const Vector<int>& vec);

但这不是:

ostream& operator << (ostream &out,const Vector& vec);

是否有可能让第二行以某种方式为任何版本的矢量工作? 例如vector<int>vector<double>,而无需编写2个单独的函数?

添加到问题:

我做了op&lt;&lt;像你建议的模板功能。为了使它成为vector类的友元函数,我尝试将以下内容添加到Vector类定义中,但它不起作用:

friend ostream& operator << (ostream &out, const Vector<T>& vec); 

有什么想法可以解决它吗?

3 个答案:

答案 0 :(得分:5)

当然,将其设为模板功能:

template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec);

答案 1 :(得分:2)

template <class T>
ostream& operator << (ostream &out,const Vector<T>& vec);

答案 2 :(得分:1)

正如已经指出的那样,这应该有用:

template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec) {
    // body here
}

至于朋友的要求,最容易处理:

template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec) {
    vec.print_on( out );
    return out;
}

然而,通常我会想到这样的任何输出操作符需要访问类的内部,以便在Vector类中显示错误。它实际上只需要使用公共接口来进行显示。

另一件事是您可能还想模拟输出流本身,以便保留其类型:

template <typename O, typename C, typename T>
std::basic_ostream<O, C>& operator << (std::basic_ostream<O, C> &out,const Vector<T>& vec) {
    vec.print_on( out );
    return out;
}

Vector的{​​{1}}仍然可以使用print_on