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

《C++箴言:声明为非成员函数的时机》阐述了为什么只有 non-member functions(非成员函数)适合于应用到所有 arguments(实参)的 implicit type conversions(隐式类型转换),而且它还作为一个示例使用了一个 Rational class 的 operator* function。我建议你在阅读本文之前先熟悉那个示例,因为本文进行了针对《C++箴言:声明为非成员函数的时机》中的示例做了一个无伤大雅(模板化 Rational 和 operator*)的扩展讨论:

template<typename T>
class Rational {
public:
Rational(const T& numerator = 0, // see《C++箴言:用传引用给const取代传值》for why params
const T& denominator = 1); // are now passed by reference
const T numerator() const; // see《C++箴言:避免返回对象内部构件的句柄》for why return
const T denominator() const; // values are still passed by value,
... // Item 3 for why they're const
};
template<typename T>
const Rational<T> operator*(const Rational<T>& lhs,
const Rational<T>& rhs)
{ ... }


就像在《C++箴言:声明为非成员函数的时机》中,我想要支持 mixed-mode arithmetic(混合模式运算),所以我们要让下面这些代码能够编译。我们指望它能,因为我们使用了和 Item 24 中可以工作的代码相同的代码。仅有的区别是 Rational 和 operator* 现在是 templates(模板):

Rational<int> oneHalf(1, 2); // this example is from 《C++箴言:声明为非成员函数的时机》,
// except Rational is now a template
Rational<int> result = oneHalf * 2; // error! won't compile


编译失败的事实暗示对于模板化 Rational 来说,有某些东西和 non-template(非模板)版本不同,而且确实存在。在《C++箴言:声明为非成员函数的时机》中,编译器知道我们想要调用什么函数(取得两个 Rationals 的 operator*),但是在这里,编译器不知道我们想要调用哪个函数。作为替代,它们试图断定要从名为 operator* 的 template(模板)中实例化出(也就是创建)什么函数。它们知道它们假定实例化出的某个名为 operator* 的函数取得两个 Rational<T> 类型的参数,但是为了做这个实例化,它们必须断定 T 是什么。问题在于,它们做不到。

时间: 2024-12-23 03:29:17

C++箴言:类型转换时定义非成员函数的相关文章

C++:使用非成员函数(non-member)处理函数的所有参数都需要类型转换

有些函数, 所有参数都需要使用类型转换, 比如乘法, 写一个有理数类Rational, 需要执行乘法操作: 函数满足: Rational = Rational*double; Rational = double*Rational; 则需要使用非成员函数(non-member); 成员函数的发起者必须是类, 因为可能出现double类型在前的情况, 则无法执行乘法, 所以应使用非成员函数; 执行时: 即Rational = Rational*Rational(double); Rational =

access-Access中定义GroupConcat函数时, .显示用户定义类型未定义,怎么修改?

问题描述 Access中定义GroupConcat函数时, .显示用户定义类型未定义,怎么修改? 定义的函数如下:Public Function GroupConcat(sColumn As String sTable As String Optional sCriteria As String Optional sDelimiter As String = "")On Error GoTo ErrHandlerDim rs As New ADODB.RecordsetDim sSQL

c++ 成员函数与非成员函数的抉择_C 语言

1.尽量用类的非成员函数以及友元函数替换类的成员函数 例如一个类来模拟人People 复制代码 代码如下: 1 class People{ 2 public: 3 ... 4 void Getup( ); 5 void Washing( ); 6 void eating( ); 7 ... 8 } 其实上面三个动作是早上"起床"."洗簌"."吃饭"三个常见的动作,如果现在用一个函数来表示使用成员函数即为 复制代码 代码如下: 1 class Pe

C++类的成员函数(在类外定义成员函数、inline成员函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

php运行时动态创建函数的方法

 这篇文章主要介绍了php运行时动态创建函数的方法,涉及php流程语句与create_function函数的使用技巧,需要的朋友可以参考下     本文实例讲述了php运行时动态创建函数的方法.分享给大家供大家参考.具体分析如下: 一般的语言函数必须定义了在运行,而php支持在运行时动态创建函数,下面是一个简单的范例,在运动时根据不同的条件创建函数$a ? 1 2 3 4 5 6 7 8 9 10 11 <?php if (count($_POST) > 0) { $prepped = cre

外部函数调用-【江湖救急】定义外部函数名被关键字占用如何处理?

问题描述 [江湖救急]定义外部函数名被关键字占用如何处理? 在下用PB调用一个动态库,里面有一个方法名叫execute(), 但是定义时跟PB的execute关键字冲突,无法定义和使用, 跪求各位大神该如何处理? 多个函数,其中open.close虽PB内部也有,但是可以定义成功并使用, FUNCTION integer open(string devtype,string serialport,int baudrate,ref string pszRcCode) LIBRARY "Driver

c++运算符重载为非成员函数问题

问题描述 c++运算符重载为非成员函数问题 用vc6.0写复数类,使运算符重载为非成员函数,组建时出现fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1794) Please choose the Technical Support command on the Visual C++ Help menu, or open the Technical Support help file for m

SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题

用户定义函数(UDF)分类       SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(Table-Valued Function).其中表值函数又分为Inline table-valued functions和Multistatement table-valued functions.     用户定义函数(UDF)在 SQL Server 中发挥重要的作用.用户定义函数可以

第13周报告2:定义自定义函数,计算sin和cos的近似值

任务2:先听故事,再编程序.故事是这样的:话说sin和cos是一对夫妇.一天,sin去听相声了,cos在家.过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数.cos问:你是谁啊?他说:我是你的老公sin啊.cos说:你不是去听相声了吗?怎么成这幅摸样了?他说:是啊,太乐了!故事讲完了.不懂吗?好好学高数.否则,挂了不冤.   编程序求出sin(π/2).cos(87°) 程序的要求是这样的:(1)求sin.cos时,不能用数学库函数(即不得用#include<Cmath>),而是自