首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板定义中的friend函数

模板定义中的friend函数
EN

Stack Overflow用户
提问于 2010-01-16 17:39:40
回答 2查看 646关注 0票数 2

我的问题与this one有一点关系。

我想重载某个类的运算符<<,我发现了两种不同的符号,这两种符号都有效:

代码语言:javascript
复制
template <class T>
class A{
  T t;
public:
  A(T init) : t(init){}
  friend ostream& operator<< <> (ostream &os, const A<T> &a); //need forward declaration
  //template <class U> friend ostream& operator<< (ostream &os, const A<U> &a);
};

我是否用不同的符号定义了相同的东西?或者第一个版本的限制更多,<<的实例(在本例中只有与我的类A具有相同T的实例)是A的朋友?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-16 17:48:07

第一个版本将友谊限制为特定类型A<T>operator<<,而第二个版本使任何接受A<SomeType>operator<<都成为朋友。

所以,是的,第一个限制更多:

代码语言:javascript
复制
template<class T>
ostream& operator<< (ostream& os, const A<T>& a) {
    A<double> b(0.0);
    b.t; // compile error with version 1, fine with version 2
    return os;
}

int main() {
    A<int> a(0);
    cout << a << endl;
}
票数 1
EN

Stack Overflow用户

发布于 2010-01-16 18:39:22

碰巧友元函数的定义对于模板有一个例外。它允许您编写以下代码:

代码语言:javascript
复制
template <class T>
class A{
  T t;
public:
  A(T init) : t(init){}
  friend ostream& operator<<(ostream &os, const A &a)
  {  // Implementation in the class
  }
};

它的优点是可以为您创建的每个A<T>实例创建一个自动创建的normal函数。

参考:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2076874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档