WEB开发网
开发学院软件开发VC 模板友元化 阅读

模板友元化

 2007-03-16 21:57:45 来源:WEB开发网   
核心提示: 好消息(重复):我用来测试它的当前的每一个编译器(除了gcc以外)都至少对二者之一有完好的支持,让我们再多花点儿时间来看看吧,模板友元化(2),最初的尝试本文所述曾经被Stephan Born 在Usenet中作为一个问题提出,他想要做如上的事情,友元就是该函数,3、否则,他的问题是,当他

好消息(重复):我用来测试它的当前的每一个编译器(除了gcc以外)都至少对二者之一有完好的支持。

让我们再多花点儿时间来看看吧。

最初的尝试

本文所述曾经被Stephan Born 在Usenet中作为一个问题提出,他想要做如上的事情。他的问题是,当他尝试将boost::checked_delete()的一个特化声明为Test类的友元时,代码不能被他使用的Microsoft Visual C++ 6.0编译器所接受。

下边是他的源代码:

//例1:授权给友元的方法
class Test {
 ~Test() { }
 friend void boost::checked_delete( Test* x );
};   

事实上,上述代码不仅不能通过上边所说的编译器的编译,而且不能通过几乎所有的编译器。简单的说,例1的友元声明:

是符合标准的,但却依赖语言的晦涩之处。

是被当前大多数编译器所拒绝的,包括一些很好的编译器。

是容易被修复成不依赖于此晦涩之处的,而且可以通过当前的所有编译器,除了gcc。

我将要深入研究解释C++语言提供给你用来声明友元的四种方法。那是容易的。我也会给你看一些现实中的编译器处理它的有趣的东西,并提出一个方针来实现最便捷的代码,来结束本文。

为什么合法但却晦涩

C++标准的第14.5.3条列举了四条声明友元的规则,归结如下:

1、如果该友元的名字是一个具有确切的模板参数的特化了的模板名字(例如:Name<SomeType>) 

则,友元就是此模板的特化。

2、否则,如果该友元在某个类或者命名空间(例如:Some::Name)中,而且该类或者命名空间包含一个匹配的非模板函数,

则,友元就是该函数。

3、否则,如果该友元是在某个类或者命名空间(例如:Some::Name)中的,而且该类或者命名空间包含一个匹配的模板函数(具有适当的模板参数)

上一页  1 2 3 4 5 6  下一页

Tags:模板 元化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接