Template : cannot convert parameter 1 from const * to *const & ?

Discussion in 'C++' started by nassim.bouayad.agha@gmail.com, May 23, 2007.

  1. Guest

    Hello,
    here is a code snippet showning my problem :

    template<typename _K>
    class TClass1
    {
    public:
    void Process(const _K& arg) const
    {

    }
    };
    template<typename _I>
    class TClass2
    {
    public:
    void Process(const _I* & arg) const
    {
    _class1.Process(arg);
    }
    protected:
    TClass1<_I*> _class1;

    };
    int main(int argc, char* argv[])
    {

    TClass2<int> test1;

    int* ptr = new int;

    test1.Process(ptr);

    delete ptr;

    return 0;
    }

    This code does not compile, I have got the following error message :
    "cannot convert parameter 1 from 'const int *' to 'int *const & '"
    Any idea?I have noted that if I declare _class1 as TClass1<const _I*>,
    it is working...
    Regards!
    , May 23, 2007
    #1
    1. Advertising

  2. wrote:
    > Hello,
    > here is a code snippet showning my problem :


    The first problem is all those underscores. Why do you think
    you need them at all?

    >
    > template<typename _K>
    > class TClass1
    > {
    > public:
    > void Process(const _K& arg) const
    > {
    >
    > }
    > };
    > template<typename _I>
    > class TClass2
    > {
    > public:
    > void Process(const _I* & arg) const
    > {
    > _class1.Process(arg);


    '_I' is 'int', right? '_class1' then 'TClass1<int*>', right?
    Then its template argument (the '_K' inside) is 'int*', right?
    What's the specification of the 'Process' member, then?

    void TClass1<int*>::process(int* const&);

    So, when you're calling '_class1.Process', what argument type
    are you giving? '_I const * &'. Considering '_I' is 'int',
    you are trying to call 'Process' with

    int const * &

    instead of

    int * const &

    .. Decide on the position of the const. Or drop the * from
    the definition of '_class1'.

    > }
    > protected:
    > TClass1<_I*> _class1;
    >
    > };
    > int main(int argc, char* argv[])
    > {
    >
    > TClass2<int> test1;
    >
    > int* ptr = new int;
    >
    > test1.Process(ptr);
    >
    > delete ptr;
    >
    > return 0;
    > }
    >
    > This code does not compile, I have got the following error message :
    > "cannot convert parameter 1 from 'const int *' to 'int *const & '"
    > Any idea?I have noted that if I declare _class1 as TClass1<const _I*>,
    > it is working...


    Right. If you add a const at the _I, the function you're trying to
    call is

    void TClass1<int const*>::process(int const* const&);

    which is fine. Its argument ('int const* const&') is compatible with
    'int const* &' you're trying to give it.

    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, May 23, 2007
    #2
    1. Advertising

  3. Guest

    Re: Template : cannot convert parameter 1 from const * to *const & ?

    On 23 mai, 17:22, wrote:
    > On 23 mai, 16:59, "Victor Bazarov" <> wrote:
    >
    >
    >
    >
    >
    > > wrote:
    > > > Hello,
    > > > here is a code snippet showning my problem :

    >
    > > The first problem is all those underscores. Why do you think
    > > you need them at all?

    >
    > > > template<typename _K>
    > > > class TClass1
    > > > {
    > > > public:
    > > > void Process(const _K& arg) const
    > > > {

    >
    > > > }
    > > > };
    > > > template<typename _I>
    > > > class TClass2
    > > > {
    > > > public:
    > > > void Process(const _I* & arg) const
    > > > {
    > > > _class1.Process(arg);

    >
    > > '_I' is 'int', right? '_class1' then 'TClass1<int*>', right?
    > > Then its template argument (the '_K' inside) is 'int*', right?
    > > What's the specification of the 'Process' member, then?

    >
    > > void TClass1<int*>::process(int* const&);

    >
    > > So, when you're calling '_class1.Process', what argument type
    > > are you giving? '_I const * &'. Considering '_I' is 'int',
    > > you are trying to call 'Process' with

    >
    > > int const * &

    >
    > > instead of

    >
    > > int * const &

    >
    > > . Decide on the position of the const. Or drop the * from
    > > the definition of '_class1'.

    >
    > > > }
    > > > protected:
    > > > TClass1<_I*> _class1;

    >
    > > > };
    > > > int main(int argc, char* argv[])
    > > > {

    >
    > > > TClass2<int> test1;

    >
    > > > int* ptr = new int;

    >
    > > > test1.Process(ptr);

    >
    > > > delete ptr;

    >
    > > > return 0;
    > > > }

    >
    > > > This code does not compile, I have got the following error message :
    > > > "cannot convert parameter 1 from 'const int *' to 'int *const & '"
    > > > Any idea?I have noted that if I declare _class1 as TClass1<const _I*>,
    > > > it is working...

    >
    > > Right. If you add a const at the _I, the function you're trying to
    > > call is

    >
    > > void TClass1<int const*>::process(int const* const&);

    >
    > > which is fine. Its argument ('int const* const&') is compatible with
    > > 'int const* &' you're trying to give it.

    >
    > > V
    > > --
    > > Please remove capital 'A's when replying by e-mail
    > > I do not respond to top-posted replies, please don't ask- Masquer le texte des messages précédents -

    >
    > > - Afficher le texte des messages précédents -- Masquer le texte des messages précédents -

    >
    > > - Afficher le texte des messages précédents -

    >
    > Thank you!- Masquer le texte des messages précédents -
    >
    > - Afficher le texte des messages précédents -


    Hello,
    I still have a problem.The exemple that I gave is trivial,but how can
    I do if I need to use this,for stl containers?For exemple,if I want a
    multimap which key is a pointer on a type?!This may cause problems
    because I need to store pointers to non const objects...
    Any idea?
    Thank you in advance.
    Regards.
    , May 24, 2007
    #3
    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. Alfonso Morra
    Replies:
    3
    Views:
    1,757
    Christopher Benson-Manica
    Aug 12, 2005
  2. John Smith
    Replies:
    6
    Views:
    5,293
    Mike Wahler
    Oct 31, 2005
  3. Replies:
    0
    Views:
    859
  4. Replies:
    0
    Views:
    615
  5. Stuart Redmann
    Replies:
    5
    Views:
    468
    Stuart Redmann
    Dec 14, 2007
Loading...

Share This Page