模板化函数不接受原始类型?

时间:2012-12-14 18:47:34

标签: 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);  
  return(0);
}

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

4 个答案:

答案 0 :(得分:3)

您需要传递类型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);
}

答案 1 :(得分:2)

你必须传递一些int类型的“实例”......而不仅仅是键入自己......

func(int(123));

会好的

答案 2 :(得分:2)

trmplate代码没有问题,但是

func(int);

无效。你可能意味着

func(int());

答案 3 :(得分:1)

如果您希望显式实例化并在T设置为int的情况下调用您的函数,则必须将int作为模板参数传递:{ {1}}。

这并不能免除您提供“普通”参数的原因,因为您使用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>();

虽然这会强制您始终明确指定模板参数。

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