2009-06-14 105 views
0

有什么办法创建一个函数来接受任何版本的给定 模板类?使用模板类作为参数

例如这个工程:

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

但这并不:

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

是否有可能得到第二行以某种方式为载体的任何版本的工作? 例如vector<int>vector<double>而不必编写2个单独的功能?

加质疑:

我做运算< <模板功能,就像你建议。为了使向量类我尝试添加下列到Vector类定义的一个朋友的功能,但它没有工作:

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

可以做些什么来解决它的任何想法?

+2

如果不编辑班级的定义(并在那里指定友谊),则无法让某个功能成为班级的朋友。 你可以指定你想要完成的操作符,它需要它是一个朋友功能吗?你可能不需要友谊。 – 2009-06-14 05:52:59

回答

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

Vectorprint_on仍然可以使用ostream

+0

+1。你对运营商<<()通常不需要成为朋友也是对的。 – 2009-06-14 10:50:39

5

当然,使它成为一个模板函数:

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

值得注意的是,你必须最有可能内联功能体以及 – 2009-06-14 05:03:46

2
template <class T> 
ostream& operator << (ostream &out,const Vector<T>& vec); 
相关问题