2017-01-26 1 views
0

J'ai créé un opérateur rxcpp personnalisé appelé validateImplementation qui devrait simplement prendre un flux observable générique, faire des validations sur le SimpleInterface et continuer ou terminer le flux en fonction d'un certain condition (dans mon cas, la condition est whatsMyId)Comment déduire correctement un générique dans un opérateur personnalisé rxcpp

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; 
      } 
      } 
      ); 
    }; 
} 

Cependant, lorsque vous essayez d'utiliser la méthode validateImplementation dans main.cpp, je reçois les erreurs suivantes:

no matching member function for call to 'validateImplementation'

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

Pouvez-vous me aider à comprendre ce que je fais mal?

+0

Veuillez publier [mcve] comme texte dans votre question elle-même (en [éditant] elle). –

Répondre

1

Les types C++ doivent être résolus complètement avant que la fonction puisse être utilisée. De plus, les paramètres du modèle ne peuvent être déduits qu'à partir des paramètres, pas du type de retour. Enfin, la définition d'une fonction avec des paramètres de modèle doit être visible lorsqu'elle est appelée (dans un en-tête) ou explicitement instanciée pour chaque type pris en charge (dans un cpp).

Dans ce cas, j'éviterais les instanciations explicites. Cela signifie qu'il y a deux options.

supprimer le paramètre de modèle

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

déplacer la définition du cpp à l'en-tête et changement main.cpp être explicite sur le type, car il ne peut pas être déduit.

o->validateImplementation<string>(s1) |