从模板创建通用打印功能以打印原始数据类型变量的值

时间:2018-10-05 06:34:03

标签: c++

正如问题所建议的那样,我正在尝试创建一个非常简单的通用打印函数,该函数试图包装std::cout(很糟糕!)。下面是我编写的代码。但是,当我尝试使用它来打印变量x的值时,似乎给了我动态分配的____(我真的不知道该放在哪里,所以也请随时填补这个空白! )我的问题是,有人可以解释一下这种行为,为什么这种行为无法正常工作吗?

template <typename T>
void printValueOf(T)
{
    T t;
    std::cout << t << std::endl;
}

int main(int argc, char **argv)
{
    int x = 12;
    printValueOf(x);
    return 0;
}

我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

您是否启用了编译器警告?以GCC中的Wall标志为例,我得到了:

In function 'void printValueOf(T) [with T = int]':
warning: 't' is used uninitialized in this function [-Wuninitialized]
|     std::cout << t << std::endl;
         ~~~~~~~~~~^~~~

将功能更改为此:

template <typename T>
void printValueOf(T t)
{
    std::cout << t << std::endl;
}

您期望类型为T的类型名,参数为t的名为T的参数,并最终打印t

在发布的函数中,仅提供参数的类型就忽略了该参数,然后创建了一个名为t的新局部变量。您没有初始化变量t,然后打印它,因此出现编译器警告。

但是,您不想创建新的局部变量,而是要打印传递的参数。


对于初学者来说有点高级,但是您的代码可以编译的原因是:Specifying function parameter type, but not variable