编译器-c++中显式实例化的问题?

问题描述

c++中显式实例化的问题?

先看看一下代码:
#include

template
T lesser(T a, T b)
{
return a < b ? a : b;
}

int lesser(int a, int b)
{
a = a < 0 ? -a : a;
b = b < 0 ? -b : b;
return a < b ? a : b;
}
int main()
{
using namespace std;
int m = 20;
int n = -30;
double x = 15.5;
double y = 25.9;

cout << lesser(m, n) << endl;
cout << lesser(x, y) << endl;
cout << lesser<>(m, n) << endl;     //***
cout << lesser<int>(x, y) << endl;
cin.get();
return 0;

}

看看打着星号的那一行。
这一行进行了显式实例化,就是直接告诉编译器我要
template
T lesser(T a, T b)
这个模板的int形式,即是:
int lesser(int a, int b)
那么问题来了:
这个int的显示不是跟上面定义的非模板函数在函数特征上一样了么?
这样不算重定义么?
为什么还能正常运行呢?
求解= =

解决方案

 比如说,这样的函数:
class A {};
class B : public A {};
class C : public B {};
void foo(A a) {}
void foo<T>(B b) {}
那么
C c;
foo(c);
请问调用的是哪个?

解决方案二:

C++模版 显式实例化、显式具体化、隐式实例化
c++模版技术:包含模型、显式实例化、分离模型

解决方案三:

你写了一个特例模板,编译器匹配的时候会找最近能匹配的,而且特例的模板优先级高于模板,就是说会先匹配两个带int参数的函数。

解决方案四:

这是编译器的一种实现方式,**_你写了一个特例模板,编译器匹配的时候会找最近能匹配的,而且特例的模板优先级高于模板,就是说会先匹配两个带int参数的函数。_**
不然你想想,微软怎么开发出来高性能的编译器...其实有些问题应该自己多动脑子去想,不要一味的去问,这样往往得不到好的答案,或者答案满足不了你的问题,那么
建议看看Thinking in c++, 里面关于模版说的很清楚!!!

时间: 2024-11-15 22:12:55

编译器-c++中显式实例化的问题?的相关文章

详解在C++中显式默认设置的函数和已删除的函数的方法_C 语言

在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数.已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用. 显式默认设置的函数和已删除函数的好处 在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数.复制构造函数.复制赋值运算符和析构函数.这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构.也就是说,可以创

SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?

原文:SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?   本文出处:http://www.cnblogs.com/wy123/p/6704619.html      问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯,对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临

plsql-PLSQL中定义显式游标时用了INTO子句没有报错,请教这个INTO子句的作用是什么?

问题描述 PLSQL中定义显式游标时用了INTO子句没有报错,请教这个INTO子句的作用是什么? 如题,在定义显式游标时用了INTO子句,能编译正常且执行也没错,请问这里的into有啥作用? 代码如下: DECLARE pi_org_cd VARCHAR2(15); -- org cd CURSOR cur_test_data IS SELECT 'MYTEST' org_cd INTO pi_org_cd FROM DUAL ; BEGIN OPEN cur_test_data; FETCH

在SQL Server数据库中为标识(IDENTITY)列插入显式值_MsSql

如果我们在标识列中插入值,例如: insert member(id,username) values(10,'admin') 则在查询分析器里面会返回错误信息:  引用内容 服务器: 消息 544,级别 16,状态 1,行 1 当 IDENTITY_Insert 设置为 OFF 时,不能向表 'member' 中的标识列插入显式值. 而在ASP程序中会返回错误信息:  引用内容 Microsoft OLE DB Provider for SQL Server 错误 '80040e14'  当 I

python 参数列表中的self 显式不等于冗余_python

self在区分全局变量/函数和对象中的成员变量/函数十分有用.例如,它提供了一种作用域机制,我个人认为比Ruby的@和@@清晰多了,这可能是习惯使然吧,但它确实和C++.Java中的this很相似. 然而,self总是有令我困扰的地方,我以前在这里说过-我曾幻想能在Python3中这些能得以改进,然后通常会引发一轮热议并最终以人们所说的"显胜于隐"告终. 我在巴西的时候曾和Luciano Ramalho(巴西Python组织的主席)有过一次交谈.他让我明白并非无处不在的self让我困扰

在SQL Server数据库中为标识(IDENTITY)列插入显式值

如果我们在标识列中插入值,例如: insert member(id,username) values(10,'admin') 则在查询分析器里面会返回错误信息:  引用内容 服务器: 消息 544,级别 16,状态 1,行 1 当 IDENTITY_Insert 设置为 OFF 时,不能向表 'member' 中的标识列插入显式值. 而在ASP程序中会返回错误信息:  引用内容 Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 当 ID

Visual Basic 2005在语言上的增强(十三)显式的数组范围及小结

visual|数组 显式的数组范围 你现在可以使用显式的数组范围来声明数组,这样的声明更加清晰可读了:Dim a(10) As Integer '旧方式Dim b(0 To 10) As Integer '新方式 Visual Basic中的数组范围仍然是以零为起始,所以如果你想声明一个不是以零为起始范围的数组,你就会得到一个编译器错误. 小结 Visual Basic 2005语言获得了一些重要的特性以及诸多细微的增强,这些都极大地提高了它的易用性和开发人员的生产效率.这个语言变得更加完善,并

C#的显式数值转换

显式数值转换是指当不存在相应的隐式转换时,从一种数字类型到另一种数字类型的转换.包括: ●从sbyte到byte,ushort,uint,ulong,或char. ●从byte到sbyte或char. ●从short到sbyte,byte,ushort,uint,ulong,或char. ●从ushort到sbyte,byte,short,或char. ●从int到sbyte,byte,short,ushort,uint,ulong,或char. ●从uint到sbyte,byte,short,

《Haskell趣学指南》—— 第2章,第2.1节显式类型声明

第 2 章 相信类型Haskell趣学指南强大的类型系统是Haskell的秘密武器.在Haskell中,每个表达式都会在编译时得到明确的类型,从而提高代码的安全性.若你写的程序试图让布尔值与数相除,就不会通过编译.这样的好处就是与其让程序在运行时崩溃,不如在编译时捕获可能的错误.Haskell中一切皆有类型,因此编译器在编译时可以得到较多的信息来检查错误. 与Java和Pascal不同,Haskell支持类型推导(type inference).写下一个数,不必额外告诉Haskell说"它是个数