1

此代码无法编译,但我不知道为什么,该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);
}

这个模板/代码有什么问题?

4

4 回答 4

3

您需要传递 type 的实例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);
}
于 2012-12-14T18:49:54.087 回答
2

你必须传递一些类型的“实例” int......不仅仅是类型本身......

func(int(123));

会好的

于 2012-12-14T18:50:07.477 回答
2

trmplate 代码没有任何问题,但是

func(int);

无效。你可能是说

func(int());
于 2012-12-14T18:51:05.973 回答
1

如果您想显式实例化并使用Tset to调用您的函数int,则必须将其int作为模板参数传递foo<int>

这并不能成为您提供“普通”参数的借口,因为您使用类型的一个“普通”参数声明了您的函数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;
}

尽管这将迫使您始终明确指定模板参数。

如果您有其他想法,则必须解释它是什么。

于 2012-12-14T18:54:50.583 回答