当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 模板友元化
模板友元化 如何将一个函数模板的特化声明为友元呢?标准C++给你提供了两种合法的语法。然而,事实上,对于其中的一种语法,几乎没有编译器对其给予支持;而对于另一种,当前所有主流编译器(除了一款以外)都对其提供了支持。 假设我们有一个函数模板,可以调用其所操作的对象的SomethingPrivate()方法。特别地,考虑boost::checked_delete()函数模板,它用以删除指定的对象——在它的实现中,会调用该对象的析构函数: namespace boost { template<typename T> void checked_delete( T* x ) { // ... 其它代码 ... delete x; }} 现在,假设你想要在一个类中使用该函数模板,则该类中只有一个私有的方法(析构函数): class Test { ~Test() { } // 私有的!};Test* t = new Test;boost::checked_delete( t ); // 错误:// Test 的析构函数是私有的,// 因此checked_delete不能调用它。 解决方案很简单:只要令checked_delete()成为Test的友元即可。(其它的方法都需要Test提供公共的析构函数)如何才能实现这个容易的解决方案呢?事实上, C++标准提供了2种方法来合法又便捷的实现它。 本文将提供一个现实的检验:在某个命名空间中,友元化一个模板――说起来容易做起来难!(现实的编译器并未对标准有完好的支持。) 总体来说,我有以下几条好消息和坏消息:
本文所述曾经被Stephan Born 在Usenet中作为一个问题提出,他想要做如上的事情。他的问题是,当他尝试将boost::checked_delete()的一个特化声明为Test类的友元时,代码不能被他使用的Microsoft Visual C++ 6.0编译器所接受。 下边是他的源代码: //例1:授权给友元的方法class Test { ~Test() { } friend void boost::checked_delete( Test* x );}; 事实上,上述代码不仅不能通过上边所说的编译器的编译,而且不能通过几乎所有的编译器。简单的说,例1的友元声明:
C++标准的第14.5.3条列举了四条声明友元的规则,归结如下:
|