如何在rxcpp自定义运算符中正确推断泛型

时间:2017-01-26 15:35:09

标签: c++ reactive-programming rxcpp

我创建了一个名为validateImplementation的自定义rxcpp运算符,该运算符应该只采用通用的可观察流,对SimpleInterface进行一些验证,并根据某个条件继续或结束流(在我的情况下,条件是whatsMyId

https://github.com/cipriancaba/rxcpp-examples/blob/master/src/SimpleOperators.cpp

template <class T> function<observable<T>(observable<T>)> SimpleOperators::validateImplementation(SimpleInterface component) {
  return [&](observable<T> $str) {
    return $str |
           filter([&](const T item) {
             if (component.whatsMyId() == "1") {
               return true;
             } else {
               return false;
             }
            }
           );
  };
}

但是,在validateImplementation中尝试使用main.cpp方法时,会出现以下错误:

no matching member function for call to 'validateImplementation'

note: candidate template ignored: couldn't infer template argument 'T'

你能帮我理解我做错了吗?

1 个答案:

答案 0 :(得分:1)

在使用函数之前,必须完全解析C ++类型。此外,模板参数只能从参数推断,而不能从返回类型推断。最后,带有模板参数的函数的定义在调用(在标题中)或为每个受支持的类型(在cpp中)显式实例化时必须是可见的。

在这种情况下,我会避免显式实例化。这意味着有两种选择。

删除模板参数

function<observable<string>(observable<string>)> validateImplementation(SimpleInterface component);

将定义从cpp移到标题更改main.cpp以明确类型,因为无法推断它。

o->validateImplementation<string>(s1) |