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

模板友元化

 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)。

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

Tags:模板 元化

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