模板用作一般类型的通用代码。但是,这意味着什么 模板不需要转换?
给出以下代码:
#include <iostream>
using namespace std;
template<class T>
T max(T a,T b) {
return (a > b ? a : b);
}
int main() {
int i = 2;
double x = 6.7;
cout << "The maximum of " << x << " and " << i <<
" is " << max<double>(i,x) << "\n";
return 0;
}
我不能做什么样的演员?
谢谢,Ronen
答案 0 :(得分:4)
你不能这样做:
int i = 2;
double x = 6.7;
max(i,x);
因为编译器将分别推断类型为int&
和double&
,并且该函数没有匹配的重载。现有模板需要两个具有相同类型的参数。
但是,如果你这样做:
max<double>(i,x);
您明确告诉编译器您要调用需要两个双精度的max
的特化。因此,编译器将为第一个参数添加从int到double的隐式转换。这是第一个例子中不会发生的转换。
如果max被声明为这样:
template<class T, class U>
T max(T a,U b) {
return (a > b ? a : b);
}
你可以再次max(i,x)
,因为现在它可以采用两种不同类型的参数。你会遇到这样的问题,即返回类型总是第一个参数的类型,这可能是不可取的。
使用新的C ++ 11标准的一些功能,您可以让编译器猜测返回类型的更高级:
#include <type_traits>
template<class T, class U>
typename std::common_type<T,U>::type max(T a,U b) {
return (a > b ? a : b);
}
答案 1 :(得分:0)
如果你打电话
,这段代码会编译并运行得很好 ::max<double>(i,x)
或删除using namespace std;
并明确调用std::cout
或...不要重载该功能。
broach@dkc-dadp01:~> g++ -o test test.cc
broach@dkc-dadp01:~> ./test
The maximum of 6.7 and 2 is 6.7
template <class T> const T& max ( const T& a, const T& b );
已经存在,并且在#include <iostream>
(至少在我正在使用的gcc中)时包括在内。因为你正在做using namespace std;
你的函数是模糊的,这不会编译。