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

templated function doesn't accept primitive types?

本文关键字:类型 不接受 函数      更新时间:2023-10-16

这段代码没有编译,但我不知道为什么,而且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(123));

会没事的

除了之外,trmplate代码没有任何问题

func(int);

无效。你可能是指

func(int());

如果要显式实例化并调用T设置为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;
}

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

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