候选模板已忽略:无法将'function<type-parameter-0-0 ()>'与'double (*)()'匹配
candidate template ignored: could not match 'function<type-parameter-0-0 ()>' against 'double (*)()'
我试图使用一个接受std::函数的模板,但模板参数推导失败。
double foo(){
return 2.3;
}
template <typename V>
void funcC (V (*fptr)()){
std::cout << "C function's value is"" << fptr() << '"' << std::endl;
}
template <typename V>
void funcCxx (std::function<V()> fptr){
std::cout << "C++ function's value is"" << fptr() << '"' << std::endl;
}
funcC (foo);
funcCxx (foo);
C函数指针样式(funcC(有效,但C++std::函数(funcCxx。
我得到这个编译器错误candidate template ignored: could not match 'function<type-parameter-0-0 ()>' against 'double (*)()'
知道是什么导致了这个错误吗?以防万一,这是用C++17在clang中编译的,但我不认为这是编译器错误。
无法推导,因为您没有将std::function
传递给funcCxx
。
在模板参数推导中,函数参数和参数类型必须匹配。否则扣款失败。
您可以让函数采用任何类型,而不是将其约束为函数指针或std::function
,然后您可以在函数内部构造std::function
:
template <typename V>
void funcCxx (V&& v){
auto f = std::function(std::forward<V>(v));
std::cout << "C++ function's value is"" << f() << '"' << std::endl;
}
另一个答案很好地解释了为什么不能使用函数模板从函数指针推导std::function
。但在你的评论中,你说你的目标是约束模板参数,只允许在没有参数的情况下调用类型。
在c++20中,引入了一些概念,使约束模板参数变得更容易。您可以使用invocable
概念来只允许可调用的类型。如果invocable
没有参数,它只接受不带参数的可调用类型:
void funcCxx20(std::invocable auto fptr) {
std::cout << "C++20 function's value is"" << fptr() << '"' << std::endl;
}
在c++17中,您可以使用std::is_invocable
和std::enable_if_t
来完成相同的事情:
template <typename F>
std::enable_if_t<std::is_invocable_v<F>, void> funcCxx(F&& fptr) {
std::cout << "C++ function's value is"" << fptr() << '"' << std::endl;
}
在c++14中,可以使用较旧形式的enable_if
和此解决方案
在这两种情况下,都可以在函数中添加using V = decltype(fptr())
来推断返回值类型。
相关文章:
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- 修复"-Wunused-parameter"取决于预处理器条件的警告
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- 为什么这段代码抱怨"a non-type template parameter cannot have type"?
- 如何修复此"argument of type incompatible with parameter"错误?
- 具有Non-type template Parameter成员函数的template类
- 为什么C++运算符重载需要"having at least one parameter of class type"?
- C++ - "Cannot declare parameter 'anonymous' to be of abstract type"