Cast-Operator ueberladen in Templates



  • Hoi. Wie an anderer Stelle schon vorgestellt, hab ich mir ein Klasse offsetvector geschrieben, die intern einen std::vector benutzt. Soeben ist CINT auf den Trichter gekommen, mir den cast-operator zu bemaengeln, den ich hinzugeuegt habe, um aus einem offsetvector einen normale vector machen zu koennen:

    template <class T, class Allocator = std::allocator<T> >
    
    class offsetvector
    {
    public:
    //[...]
    
      operator std::vector<T, Allocator>() { return vec_; };  //line 46
    
    //[...]
    
    private:
    std::vector<T, Allocator> vec_;
    };
    

    Die Fehlermeldung besagt folgendes:

    Error: Too many template arguments offsetvector.h:46:
    

    Was ist falsch?



  • Hm, nachdem er nach Auskommentieren des Cast-operators ueber einen Konstuktor gemeckert hat, hab ich versucht, in meinem Programm nur einen std::vector zu benutzen - jetzt meckert er sogar ueber einen der std::vector Konstruktoren. Werd mich mal kundig machen, warum er jetzt nichtmal die STL akzeptiert...



  • Hast du denn überhaupt die <vector> includet?



  • CStoll schrieb:

    Hast du denn überhaupt die <vector> includet?

    hab ich:

    #ifndef lumis__
    #define lumis__
    
    #include <vector>
    #include <iostream>
    
    typedef std::vector<double> dblvec;
    typedef std::vector<dblvec> dblvecvec;
    
    dblvecvec lumis;
    
    struct LumiFiller
    {
    public:
      LumiFiller() 
      { lumis.resize(2); }
    };
    
    LumiFiller a;
    
    #endif
    

    bei lumis.resize(2) faengt er an zu meckern

    Error: illegal type cast (2) _vector.h:182:
    


  • ich quote hier mal noch welche Gedanken ich mir dazu im ROOT-forum gemacht habe:

    According to my STL reference, vector<T>.resize is declared as

    void  resize(size_type sz, T c = T());
    

    thus my call above shoud be evaluated as

    lumis.resize(2, std::vector<double>() );
    

    where the default constructor of vector is declared as

    template <class T, class Allocator = std::allocator<T> >
    class vector {
    vector(const Allocator& = Allocator() );
    };
    

    when calling resize() with explicit mention of std::vector<double>(), I get a segmentation violation...

    What am I doing wrong?



  • Mach mal ein

    lumis.resize(dblvecvec::sizetype(2));
    

    daraus. Der Compiler scheitert hier an Mehrdeutigkeit.


Anmelden zum Antworten