spezialisierte Template Function wird nicht aufgerufen



  • Hi, ich bin's mal wieder.

    Es geht um folgenden Code:

    //class.h
    
    class ClassCL: public boost::property_tree::ptree
    {
      public:
        template <typename OutType>
        OutType get(const std::string pathInPT) const
        {
          //Code fuer Standardtypen
        }
    };
    
    //class.cpp
    
    template<>
    Point3DCL ClassCL::get<Point3DCL>(const std::string pathInPT) const
    {
       //Code fuer spezielle Point3D-Klasse
    }
    

    Aufruf dann über:

    Point3DCL myPoint = P.get<Point3DCL>("String");
    

    Beim kompilieren zeigt er mir aber mehrseitige Fehler an. Im Endeffekt konnte ich es darauf zurückführen, dass er trotz spezialisiertem Template das "normale" benutzt. Wenn ich das ganze mit eigenem Funktionennamen wie z.B. getPoint(...) mache, funktioniert alles wunderbar.

    Was mache ich falsch?

    Vielen Dank schonmal im voraus!
    Thorolf



  • Du musst die Spezialisierung im Header zumindest deklarieren:

    template<>
    Point3DCL ClassCL::get<Point3DCL>(const std::string pathInPT);
    

    Damit der Compiler weiß, dass er sich seine Spezialisierung nicht selbst bauen soll.

    Übrigens würde ich für den Parameter std::string const & statt std::string const benutzen. Spart u.U. Rechenzeit.



  • Das ist irgendwie logisch. Ich hatte irgendwie im Kopf, dass ich das schon ausprobiert hatte.
    Scheint nun wunderbar zu funktionieren 🙂

    Vielen Dank! 👍



  • Funktionstemplates sollte man nicht spezialisieren sondern überladen. Gibt einige Gründe, die ich grade nicht raussuchen mag, aber es sind gute Gründe 😉


  • Administrator

    pumuckl schrieb:

    Funktionstemplates sollte man nicht spezialisieren sondern überladen. Gibt einige Gründe, die ich grade nicht raussuchen mag, aber es sind gute Gründe 😉

    Das kannst du aber in diesem Fall schlecht. Der Parameter ist immer vom gleichen Typ. 😉

    Grüssli



  • pumuckl schrieb:

    Funktionstemplates sollte man nicht spezialisieren sondern überladen. Gibt einige Gründe, die ich grade nicht raussuchen mag, aber es sind gute Gründe 😉

    Darüber habe ich bei meiner (erfolglosen) Recherche gelesen. Allerdings verstehe ich nicht so ganz, wie das bei einer "Blackbox" Klasse funktionieren soll. Also hier z.B. werden ~10 Leute mit der Klasse arbeiten. Und die möchten ein möglichst konsistentes Interface und nicht je nach Typ unterscheiden. Also immer

    <Object>.get<Typ>("Pfad")
    

    Sonst hätte ich ja direkt getDouble, getPoint,... nehmen können 😉


Anmelden zum Antworten