2017-05-09 1 views
0

Ich brauche einen Lebenslauf :: Mat zu einem cv zuweisen :: Point3DC++ Überlastung Zuweisungsoperator einer Bibliotheksklasse

cv::Point3d pt; 

cv::Mat mat(3, 1, CV_64F); 

pt = mat; 

ich es auf zwei verschiedene Arten zu tun versucht. Der erste Versuch ist die folgende:

template<typename _Tp> 
inline cv::Point3_<_Tp> & cv::Point3_<_Tp>::operator = (const cv::Mat & mat){ ... } 

aber es bietet den folgenden Compiler-Fehler:

Out-of-line definition of 'operator=' does not match any declaration in 'Point3_<_Tp>' 

Ich habe auch versucht, diese andere Lösung:

template<typename _Tp> 
inline cv::Mat::operator cv::Point3_<_Tp>() const { } 

jedoch der Compiler nicht gefällt und bietet den folgenden Fehler:

Out-of-line definition of 'operator Point3_<type-parameter-0-0>' does not match any declaration in 'cv::Mat' 

Was ich vermisse?

+0

Warum nicht einfach eine freie Funktion machen 'cv :: Point3d create_point (cv :: Mat const & mat)'? Dann können Sie sagen 'cv :: Point3d pt = create_point (mat);' – CoryKramer

+0

, weil ich es vorziehen, explizite Aufruffunktion als create_point() zu vermeiden – thewoz

Antwort

0

Sie können den Zuweisungs- oder Konvertierungsoperator nicht außerhalb einer Klassendefinition definieren. Sie müssen members of the class sein.

Was Sie tun könnten, ist Ihre eigene Wrapper-Klasse, die eine solche Zuordnung ermöglicht. Etwas wie:

namespace mycv 
{ 
    class Point3d 
    { 
    public: 
     template <typename... Args> 
     Point3d(Args&& ... args) 
      : value(std::forward(args)...) 
     {} 

     Point3d& operator=(cv::Mat const& mat) 
     { 
      // do your stuff; 
      return *this; 
     } 

     operator cv::Point3d() const 
     { 
      return value; 
     } 

    private: 
     cv::Point3d value; 
    }; 
} 

int main(int argc, const char* argv[]) 
{ 
    mycv::Point3d pt; 
    cv::Mat mat; 
    pt = mat; 
} 
+0

Schade, aber danke für die Antwort. Wie auch immer, warum ist das nicht möglich? – thewoz