Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103592787
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 20:59:12

   来源:BLOG    作者:fatalerror99

这样的转换可用于函数调用过程,这没错,但是在你可以调用一个函数之前,你必须知道哪个函数存在。为了知道这些,你必须为相关的 function templates(函数模板)推演出 parameter types(参数类型)(以便你可以实例化出合适的函数)。但是在 template argument deduction(模板实参推演)过程中不考虑经由 constructor(构造函数)调用的 implicit type conversion(隐式类型转换)。《C++箴言:声明为非成员函数的时机》不包括 templates(模板),所以 template argument deduction(模板实参推演)不是一个问题,现在我们在 C++ 的 template 部分,这是主要问题。

在一个 template class(模板类)中的一个 friend declaration(友元声明)可以指涉到一个特定的函数,我们可以利用这一事实为受到 template argument deduction(模板实参推演)挑战的编译器解围。这就意味着 class Rational 可以为 Rational 声明作为一个 friend function(友元函数)的 operator*。class templates(类模板)不依靠 template argument deduction(模板实参推演)(这个过程仅适用于 function templates(函数模板)),所以 T 在 class Rational 被实例化时总是已知的。通过将适当的 operator* 声明为 Rational class 的一个 friend(友元)使其变得容易:

template
class Rational {
public:
...
friend // declare operator*
const Rational operator*(const Rational& lhs, // function (see
const Rational& rhs); // below for details)
};

template // define operator*
const Rational operator*(const Rational& lhs, // functions
const Rational& rhs)
{ ... }

现在我们对 operator* 的混合模式调用可以编译了,因为当 object oneHalf 被声明为 Rational 类型时,class Rational 被实例化,而作为这一过程的一部分,取得 Rational parameters(形参)的 friend function(友元函数)operator* 被自动声明。作为已声明函数(并非一个 function template(函数模板)),在调用它的时候编译器可以使用 implicit conversion functions(隐式转换函数)(譬如 Rational 的 non-explicit constructor(非显式构造函数)),而这就是它们如何使得混合模式调用成功的。

唉,在这里的上下文中,“成功”是一个可笑的词,因为尽管代码可以编译,但是不能连接。但是我们过一会儿再处理它,首先我想讨论一下用于在 Rational 内声明 operator* 的语法。

在一个 class template(类模板)内部,template(模板)的名字可以被用做 template(模板)和它的 parameters(参数)的缩写,所以,在 Rational 内部,我们可以只写 Rational 代替 Rational。在本例中这只为我们节省了几个字符,但是当有多个参数或有更长的参数名时,这既能节省击键次数又能使最终的代码显得更清晰。我把这一点提前,是因为 operator* 被声明为取得并返回 Rationals,而不是 Rationals。它就像如下这样声明 operator* 一样合法:

阅读(281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~