Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板操作符<;不打电话_C++_Templates_Operator Overloading_Template Specialization - Fatal编程技术网

C++ 模板操作符<;不打电话

C++ 模板操作符<;不打电话,c++,templates,operator-overloading,template-specialization,C++,Templates,Operator Overloading,Template Specialization,下面的代码实现了模板类数据,其目的是比较其成员对象。其目的是,如果成员对象是相同类型的,则该对象的操作符这里发生的是什么。我花了一段时间才找到发生这种情况的确切原因,尽管最后很简单 当您考虑运算符重载时,会有一个生成的可行函数列表,然后传递给算法,该算法决定将调用哪些函数。特别是对于运算符重载,所考虑的函数列表如下 16.3.1.2表达式中的运算符[over.match.oper/6] 重载解析的候选函数集是成员候选函数、非成员候选函数和内置候选函数的并集 对于参数类型为T1的一元运算符@(删

下面的代码实现了模板类
数据
,其目的是比较其成员对象。其目的是,如果成员对象是相同类型的,则该对象的
操作符这里发生的是什么。我花了一段时间才找到发生这种情况的确切原因,尽管最后很简单

当您考虑运算符重载时,会有一个生成的可行函数列表,然后传递给算法,该算法决定将调用哪些函数。特别是对于运算符重载,所考虑的函数列表如下

16.3.1.2表达式中的运算符[over.match.oper/6]

重载解析的候选函数集是成员候选函数、非成员候选函数和内置候选函数的并集

对于参数类型为T1的一元运算符@(删除cv限定后),或左操作数类型为T1、右操作数类型为T2的二元运算符@(删除cv限定后),准备了三组候选函数:

1) 成员候选人:

2) 非成员候选人:

3) 内置候选项:

当重载解析发生时,成员函数会发生一些特殊的情况(emphasis mine)

如果任何候选函数是成员函数(静态或非静态),但不是构造函数,将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象,并显示在第一个实际参数之前

因此,从本质上讲,您的案例中得到的重载是

template <typename U> 
bool operator<(EXACT_TYPE_PTR this, const Data<U>& cu );
template<typename T>
bool operator<(const Data<T>& a, const Data<T>& b)
模板

布尔算子这里发生的是什么。我花了一段时间才找到发生这种情况的确切原因,尽管最后很简单

当您考虑运算符重载时,会有一个生成的可行函数列表,然后传递给算法,该算法决定将调用哪些函数。特别是对于运算符重载,所考虑的函数列表如下

16.3.1.2表达式中的运算符[over.match.oper/6]

重载解析的候选函数集是成员候选函数、非成员候选函数和内置候选函数的并集

对于参数类型为T1的一元运算符@(删除cv限定后),或左操作数类型为T1、右操作数类型为T2的二元运算符@(删除cv限定后),准备了三组候选函数:

1) 成员候选人:

2) 非成员候选人:

3) 内置候选项:

当重载解析发生时,成员函数会发生一些特殊的情况(emphasis mine)

如果任何候选函数是成员函数(静态或非静态),但不是构造函数,将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象,并显示在第一个实际参数之前

因此,从本质上讲,您的案例中得到的重载是

template <typename U> 
bool operator<(EXACT_TYPE_PTR this, const Data<U>& cu );
template<typename T>
bool operator<(const Data<T>& a, const Data<T>& b)
模板

bool operator有一个成员
模板bool operator有一个成员
模板bool operator如果我正确理解了你的答案,如果我想专门化模板
operator,因为它目前位于你的代码中,const
Data
比较的LHS上的对象不会转到成员函数,因为该方法不是const,因此该指针不会是const,更好的重载是模板重载。如果将其设为常量,那么大多数调用都将转到成员函数。在转发引用时,我可以想到一些退化的情况,但如果您坚持使用参数中的
const T&
形式,则这与这里的情况无关。它们也可以共存,只是调用哪一个取决于您的代码,例如,如果您对
运算符进行了更改,如果我正确理解了您的答案,如果我想专门化模板
运算符(它当前位于您的代码中),则比较左侧的const
Data
对象将不会转到成员函数,因为该方法不是const,因此,这个指针不是常量,更好的重载是模板重载。如果将其设为常量,那么大多数调用都将转到成员函数。对于转发引用,我可以想到一些退化情况,但如果您坚持使用参数中的
const T&
形式,这与这里的情况无关。它们也可以共存,只是调用哪一个取决于您的代码,例如,如果您更改
运算符