STL源码剖析 - 模板类中的友元函数

先看个代码:

 

#include <list>
using namespace std;

 

template <class T>
class A
{
public:
    friend bool operator== <> (const A&, const A&); //注意加<>

    //friend bool operator== <T> (const A&, const A&); 可行

   //friend bool operator== <T> (const A<T>&, const A<T>&); 可行
};

template <class T>
bool operator==(const A<T>&, const A<T>&)
{
    return 1;
}

 

int _tmain(int argc, _TCHAR* argv[])
{
    A<int> a;
    A<int> b;
    a == b;
 return 0;
}

 

编译-运行皆无问题。

 

但是,把#include <list>
using namespace std;去掉后编译出错,何解?

初次猜测总不至于list和std里有什么猫腻吧,后来细细想来,原来是这样。来看另外的代码:

 

template <class T>
bool operator==(const T&, const T&);

template <class T>
class A
{
public:
    friend bool operator== <> (const A&, const A&);
};

template <class T>
bool operator==(const A<T>&, const A<T>&)
{
    return 1;
}

 

int _tmain(int argc, _TCHAR* argv[])
{
    A<int> a;
    A<int> b;
    a == b;
 return 0;
}

 

编译运行皆无问题,哈哈,发现问题所在了吧,必须在模板类声明此友元函数之前必须要有这个函数的声明,不然编译器不认。而在list std里可能就有了如红色标明的全局的==重载声明,以致于在不自觉中声明了函数,呵呵。

 

 NOTE:只有在模板类中声明友元时,如果不在声明时定义的话,你就必须在之前给这函数进行声明。但是如果不是模板类的话则不需要预先声明。代码如下:

 

class C
{
private:
    int i;
public:
    friend void func(const C&);
};

void func(const C& c) { printf("%d", c.i);}

 

int _tmain(int argc, _TCHAR* argv[])
{
    func(C()); // OK ,not error

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值