C ++模板类和模板函数

时间:2010-01-31 21:09:47

标签: c++

如果我有一个像这样的模板类和模板函数

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);

这是否意味着对于模板类,必须指定类型?

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)是的,模板参数仅针对函数模板推断,而不是类模板。