C++ 模板化函数不接受基元类型?

C++ 模板化函数不接受基元类型?,c++,templates,C++,Templates,这段代码没有编译,但我不知道为什么,而且typeid函数可以将int作为输入参数,所以问题一定与模板机制有关,但我不知道失败的原因 #include <iostream> #include <typeinfo> template<typename T> void func(T) { std::cout << typeid(T).name() << std::endl; } int main() { func(int);

这段代码没有编译,但我不知道为什么,而且typeid函数可以将int作为输入参数,所以问题一定与模板机制有关,但我不知道失败的原因

#include <iostream>
#include <typeinfo>

template<typename T> void func(T)
{
  std::cout << typeid(T).name() << std::endl;
}

int main()
{
  func(int);  
  return(0);
}

此模板/代码有什么问题?

您需要传递int类型的实例,而不是类型本身:

func(int());
        ^^ note the parentheses
如果不想传递实例,可以这样更改代码:

#include <iostream>
#include <typeinfo>

template<typename T> void func()
{
  std::cout << typeid(T).name() << std::endl;
}

int main()
{
  func<int>();
  return(0);
}

您需要传递int类型的实例,而不是类型本身:

func(int());
        ^^ note the parentheses
如果不想传递实例,可以这样更改代码:

#include <iostream>
#include <typeinfo>

template<typename T> void func()
{
  std::cout << typeid(T).name() << std::endl;
}

int main()
{
  func<int>();
  return(0);
}

您必须传递int类型的某个实例。。。不仅仅是打字本身

func(int(123));

一切正常

您必须传递int类型的某个实例。。。不仅仅是打字本身

func(int(123));

一切正常

模板代码没有问题,但是

func(int);
这是无效的。你可能是说

func(int());

trmplate代码没有问题,但是

func(int);
这是无效的。你可能是说

func(int());

如果您想显式实例化并调用T设置为int的函数,则必须将该int作为模板参数传递:foo

这并不能免除您提供普通参数的责任,因为您使用一个T类型的普通参数声明了您的函数

因此,使用显式指定的模板参数对foo的有效调用可能如下所示

foo<int>(0);
foo<int>(true);
foo<int>('a');
模板参数的显式规范的目的是覆盖模板参数推断机制

如果您的意图是将该普通参数保留为虚构参数,因为您甚至都没有给它命名,那么您可以为它提供一个默认参数

template<typename T> void func(T = T())
{
  std::cout << typeid(T).name() << std::endl;
}
在这种情况下,您的函数将作为

foo<int>();
或者,您可以完全去掉普通参数,因为您无论如何都不会在函数中使用它

template<typename T> void func()
{
  std::cout << typeid(T).name() << std::endl;
}
尽管这将迫使您始终显式指定模板参数


如果你还想做些什么,你必须解释它是什么。

如果你想显式地实例化并调用你的函数,把T设置为int,你必须把int作为模板参数传递:foo

这并不能免除您提供普通参数的责任,因为您使用一个T类型的普通参数声明了您的函数

因此,使用显式指定的模板参数对foo的有效调用可能如下所示

foo<int>(0);
foo<int>(true);
foo<int>('a');
模板参数的显式规范的目的是覆盖模板参数推断机制

如果您的意图是将该普通参数保留为虚构参数,因为您甚至都没有给它命名,那么您可以为它提供一个默认参数

template<typename T> void func(T = T())
{
  std::cout << typeid(T).name() << std::endl;
}
在这种情况下,您的函数将作为

foo<int>();
或者,您可以完全去掉普通参数,因为您无论如何都不会在函数中使用它

template<typename T> void func()
{
  std::cout << typeid(T).name() << std::endl;
}
尽管这将迫使您始终显式指定模板参数


如果你有别的想法,你必须解释它是什么。

int不是int。int是类型而不是值。0是一个int.BTW,请不要使用std::endl。如果您真的想刷新输出,请使用std::flush。@DietmarKühl,因为它会减慢终端输出或出于其他原因?是的。不必要地使用std::endl会导致性能问题。使用它作为默认值的人会引入一些问题,如果更改来解决这些问题,可能会涉及很多问题。int不是int。int是一种类型而不是值。0是一个int.BTW,请不要使用std::endl。如果您真的想刷新输出,请使用std::flush。@DietmarKühl,因为它会减慢终端输出或出于其他原因?是的。不必要地使用std::endl会导致性能问题。使用它作为默认设置的人会引入一些问题,如果要解决这些问题,可能需要进行很多更改。不需要强制转换。123有int类型。只是为了演示int类型实例化的构造函数形式:它可以工作,但会创建int类型的无用对象,给程序增加不必要的开销:!最好在我的情况下使用func。谢谢你的回复。仅供参考,int将创建一个默认的初始化int。。。猜猜价值:演员阵容是不需要的。123有int类型。只是为了演示int类型实例化的构造函数形式:它可以工作,但会创建int类型的无用对象,给程序增加不必要的开销:!最好在我的情况下使用func。谢谢你的回复。仅供参考,int将创建一个默认的初始化int。。。猜测值:如何传递类型而不是实例?模板只能抽象实例?如何传递类型而不是实例?模板只能抽象实例?是的,但int是一个构造函数,这意味着我必须随时调用创建int类型对象的实例。只传递type关键字怎么样?如果你不想创建一个对象,你的函数不应该带参数。如果它不带参数,则无法推断模板类型,您可以这样调用函数:func.how this signature calle
Dfunc是什么类型的调用?它是一个函数调用,使用显式指定的模板参数调用函数模板。func是一个函数模板,func是一个函数模板的实例化;谢谢。是的,但int是一个构造函数,这意味着我必须随时调用创建int类型对象的实例。只传递type关键字怎么样?如果你不想创建一个对象,你的函数不应该带参数。如果它不带参数,则无法推断模板类型,您可以这样调用函数:func。如何调用此签名?func是什么类型的调用?它是一个函数调用,使用显式指定的模板参数调用函数模板。func是一个函数模板,func是一个函数模板的实例化;谢谢。foo;相当于foo0?不。foo假设可以在没有参数的情况下调用foo。@user1849534:Huh?对于OP的foo声明,foo并不等同于foo0。foo完全无效。函数参数是必需的,不能忽略。func在g++-4.7上工作,没有问题。。。这是一个有效的电话apparently@user1849534:某些东西在g++中工作并不意味着它是有效的。Gcc编译器并不是标准遵从性的支柱,至少在默认设置方面是如此。尽管很难相信它是用g++编译的。这种扩展会破坏很多代码。你确定你对foo的定义与OP代码中的定义相同吗;相当于foo0?不。foo假设可以在没有参数的情况下调用foo。@user1849534:Huh?对于OP的foo声明,foo并不等同于foo0。foo完全无效。函数参数是必需的,不能忽略。func在g++-4.7上工作,没有问题。。。这是一个有效的电话apparently@user1849534:某些东西在g++中工作并不意味着它是有效的。Gcc编译器并不是标准遵从性的支柱,至少在默认设置方面是如此。尽管很难相信它是用g++编译的。这种扩展会破坏很多代码。你确定你对foo的定义与OP代码中的定义相同吗?