Error C2555 with pointer to class with no template instantiation?

Discussion in 'C++' started by erictham115@gmail.com, Mar 5, 2007.

  1. Guest

    Error C2555

    c:\C++ projects\stat1\stdmatrix_adapt.h(41) : error C2555:
    'std_tools::Matrix_adapter<T>::at': overriding virtual function return
    type differs and is not covariant from 'ple::imtx_impl<T>::at'

    //in my program: the derived class
    template <class T>
    class Matrix_adapter : public ple::imtx_impl<T> {
    protected:
    Matrix* m_;
    public:
    virtual const T& at(mtx_size i0, mtx_size i1) const //mtx_size -->
    unsigned int
    {return m_->at(i0, i1);}
    }
    // the base class
    template <class T>
    class imtx_impl : public imtx<T> {
    virtual const T& at(mtx_size i0, mtx_size i1) const=0;

    /*Notice Matrix_adapter.at returns a pointer to another class Matrix
    m_
    The problem arises as this class Matrix has no template instantiation
    and i set the virtual function at return as double, the same as T */

    class Matrix : public GeneralMatrix
    public:{
    const double& at(unsigned int pos0, unsigned int pos1) const { return
    v_.at(c_(pos0, pos1)); }
    }

    // However in my main program initiating T as double in the derived
    class still gives the error C2555.

    Matrix_adapter <double> matx;

    Am at loss what to do now.. any people care to help... ?
     
    , Mar 5, 2007
    #1
    1. Advertising

  2. Ian Collins Guest

    wrote:
    > Error C2555
    >
    > c:\C++ projects\stat1\stdmatrix_adapt.h(41) : error C2555:
    > 'std_tools::Matrix_adapter<T>::at': overriding virtual function return
    > type differs and is not covariant from 'ple::imtx_impl<T>::at'
    >
    > //in my program: the derived class
    > template <class T>
    > class Matrix_adapter : public ple::imtx_impl<T> {
    > protected:
    > Matrix* m_;
    > public:
    > virtual const T& at(mtx_size i0, mtx_size i1) const //mtx_size -->
    > unsigned int
    > {return m_->at(i0, i1);}
    > }
    > // the base class
    > template <class T>
    > class imtx_impl : public imtx<T> {
    > virtual const T& at(mtx_size i0, mtx_size i1) const=0;
    >
    > /*Notice Matrix_adapter.at returns a pointer to another class Matrix
    > m_
    > The problem arises as this class Matrix has no template instantiation
    > and i set the virtual function at return as double, the same as T */
    >
    > class Matrix : public GeneralMatrix
    > public:{
    > const double& at(unsigned int pos0, unsigned int pos1) const { return
    > v_.at(c_(pos0, pos1)); }
    > }
    >
    > // However in my main program initiating T as double in the derived
    > class still gives the error C2555.
    >
    > Matrix_adapter <double> matx;
    >
    > Am at loss what to do now.. any people care to help... ?
    >

    The code fragments as posted look OK, can you reproduce the problem with
    a self contained example?

    --
    Ian Collins.
     
    Ian Collins, Mar 5, 2007
    #2
    1. Advertising

  3. Guest

    On Mar 5, 1:50 pm, Ian Collins <> wrote:
    > wrote:
    > > Error C2555

    >
    > > c:\C++ projects\stat1\stdmatrix_adapt.h(41) : error C2555:
    > > 'std_tools::Matrix_adapter<T>::at': overriding virtual function return
    > > type differs and is not covariant from 'ple::imtx_impl<T>::at'

    >
    > > //in my program: the derived class
    > > template <class T>
    > > class Matrix_adapter : public ple::imtx_impl<T> {
    > > protected:
    > > Matrix* m_;
    > > public:
    > > virtual const T& at(mtx_size i0, mtx_size i1) const //mtx_size -->
    > > unsigned int
    > > {return m_->at(i0, i1);}
    > > }
    > > // the base class
    > > template <class T>
    > > class imtx_impl : public imtx<T> {
    > > virtual const T& at(mtx_size i0, mtx_size i1) const=0;

    >
    > > /*Notice Matrix_adapter.at returns a pointer to another class Matrix
    > > m_
    > > The problem arises as this class Matrix has no template instantiation
    > > and i set the virtual function at return as double, the same as T */

    >
    > > class Matrix : public GeneralMatrix
    > > public:{
    > > const double& at(unsigned int pos0, unsigned int pos1) const { return
    > > v_.at(c_(pos0, pos1)); }
    > > }

    >
    > > // However in my main program initiating T as double in the derived
    > > class still gives the error C2555.

    >
    > > Matrix_adapter <double> matx;

    >
    > > Am at loss what to do now.. any people care to help... ?

    >
    > The code fragments as posted look OK, can you reproduce the problem with
    > a self contained example?
    >
    > --
    > Ian Collins.- Hide quoted text -
    >
    > - Show quoted text -


    Ya i thought the derived and base classes look ok. Except that the
    class that the pointer points is not a template class.
     
    , Mar 5, 2007
    #3
  4. wrote:
    > On Mar 5, 1:50 pm, Ian Collins <> wrote:
    >> wrote:
    >>> Error C2555

    >>
    >>> c:\C++ projects\stat1\stdmatrix_adapt.h(41) : error C2555:
    >>> 'std_tools::Matrix_adapter<T>::at': overriding virtual function
    >>> return type differs and is not covariant from
    >>> 'ple::imtx_impl<T>::at'

    >>
    >>> //in my program: the derived class
    >>> template <class T>
    >>> class Matrix_adapter : public ple::imtx_impl<T> {
    >>> protected:
    >>> Matrix* m_;
    >>> public:
    >>> virtual const T& at(mtx_size i0, mtx_size i1) const //mtx_size
    >>> --> unsigned int
    >>> {return m_->at(i0, i1);}
    >>> }
    >>> // the base class
    >>> template <class T>
    >>> class imtx_impl : public imtx<T> {
    >>> virtual const T& at(mtx_size i0, mtx_size i1) const=0;

    >>
    >>> /*Notice Matrix_adapter.at returns a pointer to another class Matrix
    >>> m_
    >>> The problem arises as this class Matrix has no template
    >>> instantiation and i set the virtual function at return as double,
    >>> the same as T */

    >>
    >>> class Matrix : public GeneralMatrix
    >>> public:{
    >>> const double& at(unsigned int pos0, unsigned int pos1) const {
    >>> return v_.at(c_(pos0, pos1)); }
    >>> }

    >>
    >>> // However in my main program initiating T as double in the derived
    >>> class still gives the error C2555.

    >>
    >>> Matrix_adapter <double> matx;

    >>
    >>> Am at loss what to do now.. any people care to help... ?

    >>
    >> The code fragments as posted look OK, can you reproduce the problem
    >> with a self contained example?
    >>
    >> --
    >> Ian Collins.- Hide quoted text -
    >>
    >> - Show quoted text -

    >
    > Ya i thought the derived and base classes look ok. Except that the
    > class that the pointer points is not a template class.


    There is no such think in C++ as "template class". There is a class
    template and there is a class generated from a template (a template
    instantiation). Please adjust your statement and explain what (or
    which) you mean.

    You didn't post what 'imtx' template looked like, you didn't post
    any code that uses your template (which would show instantiation of it
    and the template arguements). Please consult with FAQ 5.8 for further
    clarification.

    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, Mar 5, 2007
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Fernando Cuenca
    Replies:
    4
    Views:
    2,557
    Gianni Mariani
    Sep 6, 2004
  2. christopher diggins
    Replies:
    16
    Views:
    784
    Pete Becker
    May 4, 2005
  3. Replies:
    1
    Views:
    616
    Salt_Peter
    Dec 25, 2006
  4. Ed
    Replies:
    1
    Views:
    359
  5. Noah Roberts
    Replies:
    6
    Views:
    1,235
    Johannes Schaub (litb)
    Feb 2, 2011
Loading...

Share This Page