2

What I would like to do is pass a const ListeBase<int> *pListe in my member initializer like what's in my .cxx, but it's giving me an error saying it can't convert from 'const' to 'not const'

I know I could pass it without using 'const', but I've been told it was a good habit to place const before variable you're not going to change... So, what's the reason behind the fact I can't pass a const in my member initializer ? :P

.H

#include "DataSource.h"
#include "ListeBase.h"


class DataSourceSerieDiscrete : public DataSource
{
private : 
    ListeBase<int> *pListe; 

public :
    //CONSTRUCTORS
    DataSourceSerieDiscrete();
    DataSourceSerieDiscrete(const ListeBase<int> *pListeSai);
    DataSourceSerieDiscrete(const DataSourceSerieDiscrete &DSSDSai);

    //SETTERS
    void setPListe(const ListeBase<int> *pListeSai);

    //GETTERS
    const ListeBase<int> *getPListe() const;
};

.CXX

#include "DataSourceSerieDiscrete.h"

DataSourceSerieDiscrete::DataSourceSerieDiscrete() : pListe(NULL) {};
DataSourceSerieDiscrete::DataSourceSerieDiscrete(const ListeBase<int> *pListeSai) : pListe(pListeSai) {};
DataSourceSerieDiscrete::DataSourceSerieDiscrete(const DataSourceSerieDiscrete &DSSDSai) : pListe(DSSDSai.getPListe()) {};

//SETTERS
void DataSourceSerieDiscrete::setPListe(const ListeBase<int> *pListeSai)
{
    pListe = pListeSai;
}

const ListeBase * DataSourceSerieDiscrete<type>::getPListe() const
{
    return pListe;
}

Error message :

g++ DataSourceSerieDiscrete.cxx -c
DataSourceSerieDiscrete.cxx: In constructor ‘DataSourceSerieDiscrete::DataSourceSerieDiscrete(const ListeBase<int>*)’:
DataSourceSerieDiscrete.cxx:4:101: error: invalid conversion from ‘const ListeBase<int>*’ to ‘ListeBase<int>*’ [-fpermissive]
 DataSourceSerieDiscrete::DataSourceSerieDiscrete(const ListeBase<int> *pListeSai) : pListe(pListeSai) {};
                                                                                                     ^

Same error in copy constructor

DataSourceSerieDiscrete.cxx: In copy constructor ‘DataSourceSerieDiscrete::DataSourceSerieDiscrete(const DataSourceSerieDiscrete&)’:
DataSourceSerieDiscrete.cxx:5:117: error: invalid conversion from ‘const ListeBase<int>*’ to ‘ListeBase<int>*’ [-fpermissive]
 DataSourceSerieDiscrete::DataSourceSerieDiscrete(const DataSourceSerieDiscrete &DSSDSai) : pListe(DSSDSai.getPListe()) {};
                                                                                                                     ^
James Adkison
  • 9,412
  • 2
  • 29
  • 43
Axel Samyn
  • 160
  • 1
  • 12

2 Answers2

0

Your are assigning a const pointer to a non-const pointer variable, this can't work out. You should declare your member as

const ListeBase<int> *pListe;
Peter Barmettler
  • 389
  • 2
  • 10
  • Ok, i thought we could make assignments from const to non-const, or is this specific to pointers? – Axel Samyn Mar 03 '16 at 18:11
  • Y indded, i just read more about the subject, i think i got it ;) Thanks! – Axel Samyn Mar 03 '16 at 18:20
  • Think about the difference between const T* ptr (pointer to a immutable value of type T) and T* const ptr (immutable pointer to a value of type T). The latter you can assign to its mutable analogue just like any non-pointer variable, the first one not. – Peter Barmettler Mar 03 '16 at 18:27
  • But what's weird, is that if i used my setter in the initialization constructor, instead of using the member initializer, it will work fine, even when asigning a const to a non const :/ – Axel Samyn Mar 03 '16 at 18:34
0

const type* is a pointer to a const object. You receive a pointer to a const object and try to use it a pointer to regular object, and that's what the compiler forbids.

I'd suggest you read the thread here -http://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const

Good luck!

Roy Rashti
  • 196
  • 2
  • 15