2010-02-08 43 views
0

HI, 我开始学习C++ STL的 我只是想他们中的一些小programs.one低于:C++模板查询

inline int const& max (int const& a, int const& b) 
{ 
    return a < b ? b : a; 
} 

template <typename T> 
inline T const& max (T const& a, T const& b) 
{ 
    return a < b ? b : a; 
} 

int main() 
{ 
    ::max(7, 42);   // calls the nontemplate for two ints 
    ::max<>(7, 42);  // calls max<int> (by argument deduction) 
    ::max('a', 42.7);  // calls the nontemplate for two ints 
} 

我有一些基本的问题!

  1. 为什么在这里使用的作用域分辨率为 ?

  2. 为什么/如何 ,调用::最大<>(7,42)将 假定传递的参数是

    的整数?

+0

一条建议:像这样的const引用传递/返回int并不是真正的惯用法。只要做到这一点:“int max(int a,int b)” – Manuel 2010-02-08 13:05:40

回答

6

1)为什么是这里使用范围解析 操作?

可能区分这里声明的最大值和std :: namespace中的最大值。

2)为什么/怎么就是调用::最大<>(7,42)会认为通过 参数是整数?

它不必假设任何东西 - 整数文字的类型为int。

并回答你没有问这个问题:

max('a', 42.7); 

非模板版本相匹配,因为类型转换上没有模板参数进行的,但在非模板的人进行。

3
  1. 大概是为了避免与标准::最大

  2. 这不是假设参数都是整数的冲突,它看到的参数是整数。然后它假定模板参数是int,因为参数是整数。

+0

#1并不重要,除非他有'使用命名空间标准;'或'使用std :: max;'某处,顺便说一句。 – 2010-02-08 13:08:01

0

对于2)你可能的意思是,它为什么工作 - 模板不需要整数,只需定义“<”运算符的任何类型。一个整数满足这个,所以可以将它传递给模板方法。