2010-01-31 140 views
0

如果我有一个模板类和模板函数这样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); 

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

+0

该标准本身有一个类似于你的第二个问题。 'std :: pair '必须指定其类型。这就是为什么有'std :: make_pair (T1,T2)'功能。 – MSalters 2010-02-01 12:03:12

回答

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); 
    }  
}; 
+0

我的意思是为什么'2'不能隐式转换为int? – skydoor 2010-01-31 21:17:28

+0

@skydoor,编译器应该如何知道是否要返回一个'char'或者'int'? – 2010-01-31 21:19:58

+0

@skydoor,可能会问同样的问题,为什么'1'不能隐式转换为char? – 2010-01-31 21:20:34

2

1)有类型转换,但它不与类型推断一起工作。当你指定类型时(例如getMax<int>(1,'2')getMax<char>(1,'2')),它的含义是,但如果你不这样做,编译器无法推断出你想要的是getMax<int>还是getMax<char>

2)是的,只有函数模板而不是类模板才会推断模板参数。