重载函数中的歧义:如何解决
Ambiguity in overloaded function: how is it resolved?
我重载了<<
以两种不同的形式打印pair
的内容(参见下面的代码)。第一种形式是特定于定义的pair
类型的。第二个是template
d,适用于任何一对。这两种都适合我这种类型的人。当两个原型都先于main
的定义时,不管原型的顺序如何,都使用第一个(特定的)原型。只有当注释了第一个原型时,才会使用第二个原型。
为什么用这种方式解决歧义,决定使用哪个合适的函数?
#include <iostream>
#include <map>
using namespace std;
typedef pair<string, char> pair_t;
ostream& operator<<(ostream& os, const pair_t& p); // First form, specific
template<class first_class, class second_class>
ostream& operator<<(ostream& os, const pair<first_class, second_class>& p); // Second form, generic
int main(void) {
pair_t p2;
p2 = make_pair("Fer", 'C');
cout << p2 << endl;
return 0;
}
ostream& operator<<(ostream& os, const pair_t& p)
{
os << p.first << " obtained '" << p.second << "'";
return os;
}
template<class first_class, class second_class>
ostream& operator<<(ostream& os, const pair<first_class, second_class>& p)
{
os << "(" << p.first << ", " << p.second << ")";
return os;
}
std::pair
有一个重载的转换构造函数:
template< class U1, class U2 >
constexpr pair( const pair<U1, U2>& p );
你做了这个:
p2 = make_pair("Fer", 'C');
调用std::make_pair("Fer", 'C')
返回一个类型为std::pair<const char[4], char>
的对象,该对象可转换为std::pair<std::string, char>
。
传递给std::cout
,将需要重载解析来实例化重载函数模板,创建一组函数专门化:
ostream& operator<<(ostream& os, const std::pair<std::string, char>& p)
ostream& operator<<(ostream& os, const std::pair<std::string, char>& p); //compiler generated template specialization
可以选择的规则在这里捕获
对于每一对可行函数F1和F2,隐式转换从第i个形参到第i个实参的序列排序为确定哪个更好(除了第一个参数,隐式对象参数对静态成员函数没有影响排名)
如果F1的所有参数的隐式转换不差于隐式转换,则确定F1是优于F2的函数F2、和
所有参数的转换
- 至少有一个F1的参数,其隐式转换优于对应的该参数的隐式转换 F2
- 。如果不是这样(仅在通过转换进行非类初始化的上下文中),则返回类型的标准转换序列F1到被初始化类型的转换顺序优于从F2
返回类型的标准转换顺序。- 或者F1是非模板函数,而F2是模板专门化
- 或者F1和F2都是模板专门化,而F1根据偏序规则更加专门化用于模板专门化
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 两个文件使用彼此的功能-如何解决
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- visual c++,如何获取解决方案目录中的代码
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 如何解决这个超硬恒星的创造问题
- 循环无限运行C++解决骑士之旅问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 为什么这段代码不起作用,我该如何解决?