2013-04-25 89 views
1

我写了下面的代码:传递指针类型的模板参数

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) 

回答

1

第一种情况 - T推导为char,所以T*char*。 第二种情况 - T推导为char*。这里 差异是在调用该功能

对于第一种情况应该是

myname<char>(p); 

和第二

myname<char*>(p); 

此外,差异将是,当你在函数中使用类型T

+0

Excelletanswer。如果是这种情况,如何传递像char **这样的双指针? – Whoami 2013-04-25 11:35:27

+0

@Whoami你是什么意思?第一种情况使用T **,第二次使用T,第三种情况使用T *。打电话像'myname(&p)'; – ForEveR 2013-04-25 11:42:33

+0

明白了吧)。多谢,伙计。 – Whoami 2013-04-25 11:45:37

1

当您在功能与此

template <typename T> 
void myname(T x) 
{ 
    cout<<"x is "<<x; 
    T t;     // This is char* now 
} 

+0

好用例命名! :) – Whoami 2013-04-25 11:36:24

1

在这两种情况下,使用T

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

template <typename T> 
void myname(T* x) 
{ 
    cout<<"x is "<<x; 
    T t;     // This is char now 
} 

但是区别将是可见的,编译器推断模板参数,生成功能与函数参数类型char *匹配。

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

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

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

相关问题