模板不能进行铸造是什么意思?

时间:2011-08-27 20:15:17

标签: c++ templates

模板用作一般类型的通用代码。但是,这意味着什么 模板不需要转换?

给出以下代码:

#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

2 个答案:

答案 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;你的函数是模糊的,这不会编译。

http://www.cplusplus.com/reference/algorithm/max/