模板友元化
2007-03-16 21:57:45 来源:WEB开发网核心提示: 这种情况下,横向比较的结果说明了此语法并没有被现在的编译器所公认,模板友元化(5),顺便说一句,令我们很惊讶的是Comeau, EDG, Intel 编译器都承认了这种语法,#1应该是更安全的――例2得到当前的编译器(除了gcc)和每个老式的编译器(除了MSVC++6.0)很好地支持;旁白
这种情况下,横向比较的结果说明了此语法并没有被现在的编译器所公认。顺便说一句,令我们很惊讶的是Comeau, EDG, Intel 编译器都承认了这种语法,这是因为它们都是基于EDG C++来实现的。在被测试的5种不同的C++语言实现中,有三种不能支持这个版本(gcc, Metrowerks, Microsoft),另外两种支持(Borland, EDG)。
让我们接着来试试C++标准所支持的另一种方法吧,#1:
// 例2:声明友元的另一个方法
namespace boost {
template<typename T> void checked_delete( T* x ) {
// ... 其它代码 ...
delete x;
}
}
class Test {
~Test() { }
friend void boost::checked_delete<>( Test* x );
};
int main() {
boost::checked_delete( new Test );
}
或者,等价地,我们清晰地声明:
friend void boost::checked_delete<Test>( Test* x );
无论哪一种,对上边的编译器测试的横向比较结果说明了它们被支持得更好(见 表2)。
#1应该是更安全的――例2得到当前的编译器(除了gcc)和每个老式的编译器(除了MSVC++6.0)很好地支持;
旁白:是命名空间引起的混淆
注意,如果我们要友元化的函数模板存在于同一个命名空间中,那么我们可以在现今几乎所有的编译器上正确的使用它:
// 例3:如果checked_delete不在一个命名空间中...
// 不再在 boost:: 中
template<typename T> void checked_delete( T* x ) {
// ... 其它代码 ...
delete x;
}
class Test {
// 不再需要 "boost"
friend void checked_delete<Test>( Test* x );
};
int main() {
checked_delete( new Test );
}
横向比较...(见 表3)。
更多精彩
赞助商链接