此代码无法编译,但我不知道为什么,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);
}
此模板/代码有什么问题?
答案 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>();
虽然这会强制您始终明确指定模板参数。
如果你有其他想法,你必须解释它是什么。