模板化函数不接受基元类型?
templated function doesn't accept primitive types?
这段代码没有编译,但我不知道为什么,而且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;
}
尽管这将迫使您始终显式指定模板参数。
如果你有其他想法,你必须解释它是什么。
相关文章:
- 为什么线程不接受此输入?
- 函数不接受 X 参数,函数使用默认参数
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- B不接受8作为输入的是什么?C++
- 提升错误:变量"TimeSpec RQTP"具有初始值设定项,但类型不完整
- C++数组输入不接受一定数量的整数
- C++概念assignable_from不接受 const&-return 运算符=
- 'HMAC_CTX'类型不完整
- 使用wchar_t更改字符的类型不像L
- 斯堪夫不接受输入
- 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- C++字符数组不接受超过 4 个字符的输入
- 为什么 std::is_invocable 不接受非类型模板参数
- 模板化函数不接受基元类型?
- QPlainTextEdit dragEnterEvent 不接受 text/uri-list mime 类型
- 枚举类型不能接受 CIN 命令
- 是否可以编写不接受任何类型的模板C++?
- 为什么小于操作符接受不同类型的参数,而std::min不接受
- 模板化成员函数不接受任何类型的参数?