如果我有一个像这样的模板类和模板函数
template <class T> T getMax (T a, T b) {
return (a>b?a:b);
}
template <class T> class GetMax {
public:
static T getMax(T a, T b) {
return (a>b?a:b);
}
};
为什么这些无效?
x=getMax(1, '2');
但这些是有效的
x=getMax(1,2);
这是否意味着模板函数中没有类型转换?
这是无效的
x=GetMax::getMax(1, 2);
这是否意味着对于模板类,必须指定类型?
答案 0 :(得分:3)
getMax(1, '2');
应该返回什么?一个int,还是一个char?想一想:)
你可以写:
template <class T1, class T2> T1 getMax (T1 a, T2 b) {
return (a>b?a:b);
}
但请注意,您明确返回类型1,在getMax('1',1000)
这样的情况下可能不起作用,因为100将转换为char类型,而且不够大。
后者无效,因为要使用一个类,你必须先说明它是什么类型 - 这种机制在类型扣除之前首先起作用。
如果您说明了它会起作用:
class GetMax {
public:
template <class T>
static T getMax(T a, T b) {
return (a>b?a:b);
}
};
答案 1 :(得分:2)
1)有类型转换,但它不能与类型推断一起使用。指定类型(如getMax<int>(1,'2')
或getMax<char>(1,'2')
)时的含义可行,但如果不这样做,则编译器无法推断您是否需要getMax<int>
或getMax<char>
2)是的,模板参数仅针对函数模板推断,而不是类模板。