具有std :: optional的C ++模板函数

时间:2019-10-15 18:36:29

标签: c++ templates clang++

尝试在可选的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);

0 个答案:

没有答案