2

I wrote the following code:

template <typename T>
void  myname(T* x)
{
    cout<<"x is "<<x;
}

and I Invoked:

char *p="stackOverflow";
myname(p);

It prints stackOverflow.

But if I change the template argument from (T* x) to (T x) I get the same result.

So what is the difference between the two template parameters?

void  myname (T x)  

and

void myname (T* x)
4

3 回答 3

3

第一种情况 -T被推导出为 char,因此T*将是char*. 第二种情况 -T被推导出来char*。此处的差异在于调用此类函数

对于第一种情况应该是

myname<char>(p);

第二次

myname<char*>(p);

此外,不同之处在于您使用类型输入T功能。

于 2013-04-25T10:59:30.270 回答
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
}

于 2013-04-25T11:00:32.727 回答
1

在这两种情况下,编译器都会推导出模板参数以生成与函数参数类型匹配的函数char *

在第一种情况下,它使用T = char给实例化模板void myname<char>(char* x)

在第二种情况下,它用T = char*给实例化它void myname<char*>(char* x)

另外,请注意字符串文字是常量,并且您永远不应该将非常量指针指向一个。

于 2013-04-25T11:02:17.130 回答