友元函数,模版,搞到一起了终于

#include <iostream>
using namespace std;

class S {
public:
    S(int a , int b)
 {
  i = a+b;
 }

 template<class T>
 friend void init (T t,const S&   s = S() )
 {
  cout<<s.i<<endl;
 }

private: 
 int i;
};


void main()
{
 S  s(10, 40);
 double  d = 0;
 char c = 0;
 init( d, s);
 

 

类里可以嵌套模版友元函数,但是一定要给友元一个理由来推导出T, 例如init(d, s) , 或者直接显式指定init<double>(...)

 

#include <iostream>
using namespace std;

class S {
public:
    S(int a , int b)
 {
  i = a+b;
 }

    S()
 {
  i = 0;
 }

public: 
 int i;
};

template<class T>
void init (T const& t = T())
{
 cout<<t.i<<endl;
}

void main()
{
 S  s(10, 40);

 init<S>( );

init(s);
 
}

当模版函数的参数提供默认参数,并且是默认构造函数构造的对象时,类S也必须提供默认构造函数

++++++++++

但如果是init(s), 那么可以去掉默认构造函数  T() is invalid for T=S, but the default
                        // call argument T() needs no instantiation
                        // because an explicit argument is given

#include <iostream>
using namespace std;

class S {
public:
    S(int a , int b)
 {
  i = a+b;
 }

public: 
 int i;
};

template<class T>
void init (T const& t = T())
{
 cout<<t.i<<endl;
}

void main()
{
 S  s(10, 40);

 init(s);
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值