模板参数'F'不明确
Template parameter 'F' is ambiguous
#include <functional>
#include <iostream>
template<typename T>
class MaybePtr{
T* ptr;
public:
MaybePtr(T* p) : ptr(p) {}
template <typename F,typename R = std::result_of<F(T*)>::type>
R Get(F access,F default){
if (ptr != nullptr)
return access(ptr);
else
return default(ptr);
}
};
template <typename T>
void f_void(T*) {}
int main(){
int * iptr = new int;
*iptr = 10;
auto m = MaybePtr<int>(iptr);
auto f = [](int* i) -> int {return *i + 1; };
auto f1 = [](int* i) -> int { return 0; };
int r = m.Get(f, f1); // error C2782
std::cout << f(iptr);
int i;
std::cin >> i;
}
误差error C2782: 'R MaybePtr<int>::Get(F,F)' : template parameter 'F' is ambiguous
为什么F有歧义?它应该知道F是一个接受T*并返回r的函数
带空闭包的lambda可能会退化为函数指针,但这里:
static_assert( std::is_same<decltype(f),decltype(f1)>::value,"different types" );
错误是正常的,也Visual Studio是宽松的,但你错过了一个typename
和default
是一个保留关键字。
template <typename F,typename R = typename std::result_of<F(T*)>::type>
存在一个技巧:强制lambda衰减为函数指针。下面这行编译并执行您所期望的操作,当然,它只对空闭包有效:
int r = m.Get(+f, +f1);
相关文章:
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 对函数的重新定义和不明确的调用具有数组参数
- 函数模板和不明确的模板参数
- 编译器确定不明确的参数
- 重载调用是不明确的:一对内联映射作为构造函数参数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C++具有可变参数包的函数的部分模板参数推导会在 Clang 和 MSVC 中产生不明确的调用
- 不明确的可变参数类成员访问
- 不明确的重载函数仅在参数的模板参数上有所不同
- 递归调用可变参数模板函数重载时的不明确调用
- 对没有参数的可变参数模板函数的不明确调用
- 解决模板参数推导中的不明确调用
- 可变函数指针参数的模板参数推导-处理不明确的情况
- 64 位C++传递具有"不同"调用约定作为参数的函数会产生不明确的错误
- SFINAE:如果在没有参数的情况下调用,则重载不明确
- 模板参数推导,案例不明确
- 使用可变模板参数传递成员函数指针是不明确的
- 错误 C2782:"常量_Ty &std::min(常量 _Ty &,常量_Ty &)":模板参数"_Ty"不明确
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确