template <typename Type> Type min(const Type*, int); // 注意第二个参数 template <typename Type> Type min(Type, Type); //两个参数类型相同在上述定义中,两个模板的模板形参相同,都是一个类型(typename Type),模板名称也相同,都是 min。但函数形参列表不一样,一个是 (const Type *, int),另一个是(Type, Type),所以这两个函数模板是重载的。
#include <cmath> int main() { int ia[1024]; int ival = min(ia, 1024); // Type == int; min(const int*, int) double dval = min(1.1, 2.2); // Type == double; min(double, double) return 0; }在上述主函数的定义中,第 6 行的第二个参数是一个整型数 1024,从定义上来讲,此处更适合第一个函数模板,所以该处的调用得到的模板实例就是第一个模板的实例。
template <typename T> int min(T, T) { /* ...... */ } //两个参数类型相同的函数模板 template <typename T, typename U> int min(T, U); //两个参数类型不相同的函数模板如果以如下的形式使用函数模板,将会导致二义性:
min(1024, 512);因为在这个例子中,编译器无法决定到底该实例化哪个模板。第二个函数模板,虽然其模板参数声明为两个类型(T 和 U),但并没有限制这两个类型必须不同,所以语句“min(1024, 512);”也可以看做是调用第二个模板的实例。显然这样做会引起与第一个模板的冲突,从而导致编译错误。
#include <iostream> #include <string> // 基本模板 template <typename T> void display(T value) { std::cout << "Basic template: " << value << std::endl; } // 重载1:接受两个参数的版本 template <typename T> void display(T value1, T value2) { std::cout << "Overloaded template with two parameters: " << value1 << ", " << value2 << std::endl; } // 重载2:接受一个std::string和一个T类型的参数 template <typename T> void display(std::string message, T value) { std::cout << message << ": " << value << std::endl; } int main() { int a = 1; double b = 2.0; std::string str = "Hello"; // 使用基本模板 display(a); // 使用接受两个参数的重载版本 display(a, a); // 使用接受一个std::string和一个T类型的参数的重载版本 display("Custom message", a); return 0; }输出结果为:
Basic template: 1
Overloaded template with two parameters: 1, 1
Custom message: 1
本文链接:http://task.lmcjl.com/news/16630.html