将指针类型传递给模板参数

时间:2013-04-25 10:54:22

标签: c++ templates

我写了以下代码:

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)

3 个答案:

答案 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)

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