尝试在可选的std::optional<T>
内使用模板类作为执行以下操作的模板化函数的函数参数。如果std::optional<T> param
是真实的,则使用<<
操作员将param.value()
写入std::ostringstream
。
#include <iostream>
#include <sstream>
#include <optional>
#include <string>
template<typename T>
std::string send(int number, std::optional<T> param)
{
std::ostringstream oss;
oss << std::to_string(number);
if (param)
{
oss << " " << param.value();
}
return oss.str();
}
// Works just fine
// template<typename T>
// std::string send(int number, T param)
// {
// std::ostringstream oss;
// oss << std::to_string(number);
// if (param)
// {
// oss << " " << param;
// }
// return oss.str();
// }
int main()
{
std::cout << send(1, {3});
return 0;
}
但是,上面的代码会抛出
错误:调用“发送”没有匹配功能
注意:候选模板被忽略:无法推断模板参数“ T” std :: string send(int number,std :: optional param)
编译器命令
clang++ main.cc --std=c++17
我不太明白为什么编译器无法在此处推断出模板参数。甚至当我为这样的特定类型专门实例化模板时。
template std::string send(int number, std::optional<int> param);