加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 模板参数“F”不明确

发布时间:2020-12-16 04:56:38 所属栏目:百科 来源:网络整理
导读:#include functional#include iostreamtemplatetypename Tclass MaybePtr{ T* ptr;public: MaybePtr(T* p) : ptr(p) {} template typename F,typename R = std::result_ofF(T*)::type R Get(F access,F default){ if (ptr != nullptr) return access(ptr); e
#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也是laxist,但是你错过了一个typename,而default是一个保留的关键字.

template <typename F,typename R = typename std::result_of<F(T*)>::type>

存在一个技巧:强制lambda衰减为函数指针.下面的行编译并执行您期望的操作,当然,仅对空闭包有效:

int r = m.Get(+f,+f1);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读