1.11M Members

Help with error: ISO C++ forbids comparison between pointer and integer

 
0
 

Hi

I'm trying to test my code but I keep getting some kind of strange errors

bst.hpp: In member function `void Bst<generic>::insert(generic) [with generic = int]':
test_BST.cpp:30:   instantiated from here
bst.hpp:36: error: invalid conversion from `int' to `int*'
bst.hpp:47: error: ISO C++ forbids comparison between pointer and integer
bst.hpp:52: error: ISO C++ forbids comparison between pointer and integer
bst.hpp:58: error: ISO C++ forbids comparison between pointer and integer
bst.hpp:65: error: ISO C++ forbids comparison between pointer and integer
bst.hpp:73: error: ISO C++ forbids comparison between pointer and integer
bst.hpp:79: error: ISO C++ forbids comparison between pointer and integer

here is my code

bsn.h

struct Bsn
{
  Bsn * p;          
  Bsn * l;          
  Bsn * r;         
  generic * data;   

};

bst.h

template <class generic>
class Bst
{
  public:
    Bst();
    ~Bst();
    void insert( generic x);
    void remove( generic x);
    generic & search ( generic x);
    void clear();
    bool empty();
    unsigned int size();

  protected:
    Bsn<generic> * m_root;
    Bsn<generic> * p_insert( generic x);
    Bsn<generic> * p_remove( generic x);
    Bsn<generic> * p_search( generic x);

  private:
    unsigned int m_size;

};

#include"bst.hpp"

bst.hpp ( my problem is only with the insert function everything else is fine)

template <class generic>
void Bst<generic>::insert( generic x)
{
  Bsn<generic> * temp = new Bsn<generic>;

  if( m_root == NULL)
  {
    m_root -> data = x;
    m_root -> r = NULL;
    m_root -> l = NULL;
    m_root -> p = NULL;

    m_size++;

  }

  else
  {

    if( m_root -> r == NULL && x > m_root -> data)
    {


    }
    else if( m_root -> r == NULL && x < m_root -> data)
    {



    }
    else if( m_root -> r != NULL && x < m_root -> data)
    {




    }
   else if( m_root -> r != NULL && x > m_root -> data)
    {



    }
   else
    {
      if( m_root -> l == NULL && x < m_root -> data)
      {



      }
      else if( m_root -> l != NULL && x < m_root -> data )
      {


      }

    }
  }
}

my Cppunit testing for the insert function

void Test_BST::test_insert()
{
  Bst<int>  r;

  r.insert(1);
}

Thank you for your help

 
0
 
void Bst<generic>::insert( generic x)

x is type "generic".

struct Bsn
{
  Bsn * p;          
  Bsn * l;          
  Bsn * r;         
  generic * data;   
};

data is type "pointer to generic".

if( m_root -> r == NULL && x > m_root -> data)

You are comparing a variable of type "generic" to a variable of type "pointer to generic" here. "generic", according to your error messages, is type integer in this case. So you are trying compare a pointer to an integer. The compiler isn't allowing you to do that.

 
0
 

Thank you for your replay

I tried :

void Test_BST::test_insert()
{

  Bst<int> * r;

  r.insert(1);



}

but I got


test_BST.cpp: In member function `void Test_BST::test_insert()':
test_BST.cpp:30: error: request for member `insert' in `r', which is of non-clas s type `Bst<int>*'

but I don't have clue how to fix it

Thanks in advance

 
0
 

Thank you for your replay

I tried :

void Test_BST::test_insert()
{

  Bst<int> * r;

  r.insert(1);



}

but I got

but I don't have clue how to fix it

Thanks in advance

I'm not too experienced with generics, but for sure that wasn't the reason you were getting the errors. I'd put it back to where it was before. Here's the problem:

m_root -> data = x;

and

x > m_root -> data

x is an integer.
m_root->data is a pointer to an integer.

You can't compare them like that. You CAN, however, dereference m_root->data and turn it into an integer:

*(m_root -> data)

Here * is the "dereference" operator. The below will be a comparison of an integer to another integer:

x > *(m_root -> data)

So this will be a legal line:

if( m_root -> r == NULL && x > *(m_root -> data))

You also need to change this line:

m_root -> data = x;

to this:

m_root -> data = &x;

Here's a little program I wrote with your skeleton to show how referencing and dereferencing can work. Like I said, I'm not too experienced with generics, so I made them integers:

#include <iostream>
using namespace std;

struct Bsn
{
  Bsn * p;          
  Bsn * l;          
  Bsn * r;         
  int * data;   
};


int main ()
{
        Bsn  a_root;
        Bsn* m_root;
        m_root = &a_root;

        int y = 6;        
        m_root->data = &y;
        int x = 7;

        if (x > *(m_root->data))
             cout << "if condition is true.\n";
        else
             cout << "if condition is false.\n";   
              
        return 0;
}
 
0
 

it worked :)

Thank you for your help

Question Answered as of 6 Years Ago by VernonDozier
You
This question has already been solved: Start a new discussion instead
Post:
Start New Discussion
Tags Related to this Article