正如问题所暗示的那样,我正在尝试创建一个非常简单的通用打印函数,试图包装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;
}
我在这里做错了什么?
是否启用了编译器警告?例如,使用 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
,然后打印它,因此编译器警告。
但是,您不想创建新的局部变量,而是要打印传递的参数。
对于初学者来说有点高级,但您的代码可以编译的原因是:指定函数参数类型,但不指定变量。