我写了以下代码:
template <typename T>
void myname(T* x)
{
cout<<"x is "<<x;
}
和我调用:
char *p="stackOverflow";
myname(p);
打印stackOverflow
。
但如果我将模板参数从(T* x)
更改为(T x)
,我会得到相同的结果。
那么两个模板参数之间有什么区别?
void myname (T x)
和
void myname (T* x)
答案 0 :(得分:2)
第一种情况 - T
推断为char,因此T*
将为char*
。
第二种情况 - T
推断为char*
。
这里的差异在于调用这样的函数
首先应该是
myname<char>(p);
和第二次
myname<char*>(p);
另外,在函数中使用类型T
时会有所不同。
答案 1 :(得分:1)
在功能
中使用T时,可以看到差异char *p="stackOverflow";
myname(p);
template <typename T>
void myname(T* x)
{
cout<<"x is "<<x;
T t; // This is char now
}
然而,这个
template <typename T>
void myname(T x)
{
cout<<"x is "<<x;
T t; // This is char* now
}
答案 2 :(得分:1)
在这两种情况下,编译器都会推导出模板参数,以生成与函数参数类型char *
匹配的函数。
在第一种情况下,它使用T = char
实例化void myname<char>(char* x)
模板。
在第二种情况下,它使用T = char*
实例化void myname<char*>(char* x)
。
另外,请注意字符串文字是常量,并且永远不要将非常量指针指向一个。