使用默认 template/function 个参数的显式实例化

explicit instantiation with default template/function arguments

我正在尝试显式实例化一个模板函数,该函数具有默认模板参数以及相应参数的默认值,但我找不到正确的语法。我正在尝试的是以下内容:

// in .hpp
template<typename T = std::function<void(int,int)>> void foo (T &&t = [](int,int)->void{});
//in .cpp
template<typename T> void foo (T t){...}
template void foo<>();

但我收到一条错误消息,提示 foo<> 不匹配任何模板声明。有没有办法在使用默认类型和参数值的同时仍然能够进行显式实例化?对我来说,唯一的其他选择是在 header 中定义整个函数,我不想这样做,或者放弃使用默认值。

问题是你没有保持签名一致。 header中的声明通过右值引用接受,实现文件通过值接受,并且实例化是针对绝对没有参数的函数(默认参数并不意味着函数没有参数)。

你需要在任何地方都坚持相同的签名。

所以要么

#include <functional>

template<typename T = std::function<void(int,int)>> void foo (T &&t = [](int,int)->void{});
//in .cpp
template<typename T> void foo (T&&){}

template void foo<>(std::function<void(int,int)>&&);

#include <functional>

template<typename T = std::function<void(int,int)>> void foo (T t = [](int,int)->void{});
//in .cpp
template<typename T> void foo (T){}

template void foo<>(std::function<void(int,int)>);