快速业务通道

C++箴言:类型转换时定义非成员函数

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
)。但是在 template argument deduction(模板实参推演)过程中不考虑经由 constructor(构造函数)调用的 implicit type conversion(隐式类型转换)。《C++箴言:声明为非成员函数的时机》不包括 templates(模板),所以 template argument deduction(模板实参推演)不是一个问题,现在我们在 C++ 的 template 部分,这是主要问题。

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

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

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

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

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

template<typename T>
class Rational {
public:
...
friend
const Rational<T> operator*(const Rational<T>& lhs,
const Rational<T>& rhs);
...
};

然而,使用缩写形式更简单(而且更常用)。

现在返回到连接问题。混合模式代码编译,因为编译器知道我们想要调用一个特定的函数(取得一个 Rational<int> 和一个 Rational<int> 的 operator*),但是那个函数只是在 Rational 内部声明,而没有在此处定义。我们的意图是让 class 之外的 operator* template(模板)提供这个定义,但是这种方法不能工作。如果我们自己声明一个函数(这就是我们在 Rational template(模板)内部所做的事),我们就有责任定义这个函数。当前情况是,我们没有提供

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号