Как правильно вывести обобщение в пользовательском операторе rxcpp

Я создал собственный оператор rxcpp под названием validateImplementation это должно просто взять общий наблюдаемый поток, сделать некоторые проверки на 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 ответ

Решение

В C++ типы должны быть полностью разрешены, прежде чем можно будет использовать функцию. Кроме того, параметры шаблона могут быть выведены только из параметров, а не из типа возвращаемого значения. Наконец, определение функции с параметрами шаблона должно быть видимым, когда она вызывается (в заголовке) или явно создается для каждого поддерживаемого типа (в cpp).

В этом случае я бы избегал явных реализаций. Это означает, что есть два варианта.

удалить параметр шаблона

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

переместите определение из cpp в заголовок и измените main.cpp так, чтобы он явно указывал тип, так как он не может быть выведен.

o->validateImplementation<string>(s1) |
Другие вопросы по тегам