Function Overloading Problem

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Hayrola

    #1

    Function Overloading Problem

    I have two vaiable types, named A and B. These are of the same type,
    int, but their values must be treated differently before printing. eg:

    typedef int A;
    typedef int B;

    void func(A val)
    {
    VIPfunction(val );
    std::cout << val << std::endl;
    }

    void func(B val)
    { //Error points to this line
    std::cout << val << std::endl;
    }


    This gives me the following error: "function 'void func(A)' already
    has a body"

    Is there an easy way to solve this, or
    is there another way to accomplish what i am trying to do?

  • Alf P. Steinbach

    #2
    Re: Function Overloading Problem

    * Hayrola:
    I have two vaiable types, named A and B. These are of the same type,
    int, but their values must be treated differently before printing. eg:
    >
    typedef int A;
    typedef int B;
    >
    void func(A val)
    {
    VIPfunction(val );
    std::cout << val << std::endl;
    }
    >
    void func(B val)
    { //Error points to this line
    std::cout << val << std::endl;
    }
    >
    >
    This gives me the following error: "function 'void func(A)' already
    has a body"
    >
    Is there an easy way to solve this, or
    is there another way to accomplish what i am trying to do?
    'typedef' just introduces a new name for a type. The two function
    definitions above therefore have the same signature. They're different
    definitions of the same function.

    'struct', 'class' and 'enum' introduce new types.

    --
    A: Because it messes up the order in which people normally read text.
    Q: Why is it such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing on usenet and in e-mail?

    Comment

    • Jim Langston

      #3
      Re: Function Overloading Problem

      "Hayrola" <Niklas_Hayer@h ome.sewrote in message
      news:1175431613 .662030.202900@ y66g2000hsf.goo glegroups.com.. .
      >I have two vaiable types, named A and B. These are of the same type,
      int, but their values must be treated differently before printing. eg:
      >
      typedef int A;
      typedef int B;
      >
      void func(A val)
      {
      VIPfunction(val );
      std::cout << val << std::endl;
      }
      >
      void func(B val)
      { //Error points to this line
      std::cout << val << std::endl;
      }
      >
      >
      This gives me the following error: "function 'void func(A)' already
      has a body"
      >
      Is there an easy way to solve this, or
      is there another way to accomplish what i am trying to do?
      Basically, you are trying to do two different things with the same type
      (int). One way would be to have 2 different functions, one with the
      VIPfunction, one without.

      Another way would be to wrap A and B in a structure or class. Then you
      could make a func template and specialize for type B (which would be a
      structure).

      The questionn becomes, they are both ints. Calling one A and one B in a
      typedef doesn't mean much. If you need to differentiate between them then
      just keep them straight yourself somehow.

      I can see what you are trying to accomplish, but the question is why? How
      does this help your pogram? Depending on what you are actually trying to
      achieve would say how it could be done.


      Comment

      • Hayrola

        #4
        Re: Function Overloading Problem

        On 1 Apr, 06:00, "Jim Langston" <tazmas...@rock etmail.comwrote :
        "Hayrola" <Niklas_Ha...@h ome.sewrote in message
        >
        news:1175431613 .662030.202900@ y66g2000hsf.goo glegroups.com.. .
        >
        >
        >
        I have two vaiable types, named A and B. These are of the same type,
        int, but their values must be treated differently before printing. eg:
        >
        typedef int A;
        typedef int B;
        >
        void func(A val)
        {
        VIPfunction(val );
        std::cout << val << std::endl;
        }
        >
        void func(B val)
        { //Error points to this line
        std::cout << val << std::endl;
        }
        >
        This gives me the following error: "function 'void func(A)' already
        has a body"
        >
        Is there an easy way to solve this, or
        is there another way to accomplish what i am trying to do?
        >
        Basically, you are trying to do two different things with the same type
        (int). One way would be to have 2 different functions, one with the
        VIPfunction, one without.
        >
        Another way would be to wrap A and B in a structure or class. Then you
        could make a func template and specialize for type B (which would be a
        structure).
        >
        The questionn becomes, they are both ints. Calling one A and one B in a
        typedef doesn't mean much. If you need to differentiate between them then
        just keep them straight yourself somehow.
        >
        I can see what you are trying to accomplish, but the question is why? How
        does this help your pogram? Depending on what you are actually trying to
        achieve would say how it could be done.
        To clarify what i am doing, A represents a row number, and B
        represents a column number.
        In the good ol' game chess, rows have numbers (1234...), and columns
        have letters (ABCD...).
        Therefore the need to have them use different functons.

        The already existing (C style) code assumes that A and B are ints, and
        uses memsets and memcopys everywhere.

        A solution has sprung into my mind, but i dont know if its a very good
        one:

        void func2(A val1, B val2 = -255)
        {
        if(val2 == -255)
        {
        VIPfunc();
        std::cout << val1 << std::endl;
        }
        else
        {
        std::cout << val2 << std::endl;
        }
        }

        any comments on that?

        Comment

        • Jim Langston

          #5
          Re: Function Overloading Problem

          "Hayrola" <Niklas_Hayer@h ome.sewrote in message
          news:1175435503 .725600.286900@ b75g2000hsg.goo glegroups.com.. .
          On 1 Apr, 06:00, "Jim Langston" <tazmas...@rock etmail.comwrote :
          >"Hayrola" <Niklas_Ha...@h ome.sewrote in message
          >>
          >news:117543161 3.662030.202900 @y66g2000hsf.go oglegroups.com. ..
          >>
          >>
          >>
          >I have two vaiable types, named A and B. These are of the same type,
          int, but their values must be treated differently before printing. eg:
          >>
          typedef int A;
          typedef int B;
          >>
          void func(A val)
          {
          VIPfunction(val );
          std::cout << val << std::endl;
          }
          >>
          void func(B val)
          { //Error points to this line
          std::cout << val << std::endl;
          }
          >>
          This gives me the following error: "function 'void func(A)' already
          has a body"
          >>
          Is there an easy way to solve this, or
          is there another way to accomplish what i am trying to do?
          >>
          >Basically, you are trying to do two different things with the same type
          >(int). One way would be to have 2 different functions, one with the
          >VIPfunction, one without.
          >>
          >Another way would be to wrap A and B in a structure or class. Then you
          >could make a func template and specialize for type B (which would be a
          >structure).
          >>
          >The questionn becomes, they are both ints. Calling one A and one B in a
          >typedef doesn't mean much. If you need to differentiate between them
          >then
          >just keep them straight yourself somehow.
          >>
          >I can see what you are trying to accomplish, but the question is why?
          >How
          >does this help your pogram? Depending on what you are actually trying to
          >achieve would say how it could be done.
          >
          To clarify what i am doing, A represents a row number, and B
          represents a column number.
          In the good ol' game chess, rows have numbers (1234...), and columns
          have letters (ABCD...).
          Therefore the need to have them use different functons.
          >
          The already existing (C style) code assumes that A and B are ints, and
          uses memsets and memcopys everywhere.
          >
          A solution has sprung into my mind, but i dont know if its a very good
          one:
          >
          void func2(A val1, B val2 = -255)
          {
          if(val2 == -255)
          {
          VIPfunc();
          std::cout << val1 << std::endl;
          }
          else
          {
          std::cout << val2 << std::endl;
          }
          }
          >
          any comments on that?
          In chess rows go from 1 to 8. Colums go from A to H. No other values are
          legitimate.

          void func2(int Val )
          {
          if ( Val >=1 && Val <= 8 )
          // I have a row
          else if ( Val >= 'A' && Val <= 'H' )
          // I have a column
          else
          // Danger Will Roberson!
          }


          Comment

          • Hayrola

            #6
            Re: Function Overloading Problem

            On 1 Apr, 08:24, "Jim Langston" <tazmas...@rock etmail.comwrote :
            "Hayrola" <Niklas_Ha...@h ome.sewrote in message
            >
            news:1175435503 .725600.286900@ b75g2000hsg.goo glegroups.com.. .
            >
            >
            >
            On 1 Apr, 06:00, "Jim Langston" <tazmas...@rock etmail.comwrote :
            "Hayrola" <Niklas_Ha...@h ome.sewrote in message
            >
            >news:117543161 3.662030.202900 @y66g2000hsf.go oglegroups.com. ..
            >
            I have two vaiable types, named A and B. These are of the same type,
            int, but their values must be treated differently before printing. eg:
            >
            typedef int A;
            typedef int B;
            >
            void func(A val)
            {
            VIPfunction(val );
            std::cout << val << std::endl;
            }
            >
            void func(B val)
            { //Error points to this line
            std::cout << val << std::endl;
            }
            >
            This gives me the following error: "function 'void func(A)' already
            has a body"
            >
            Is there an easy way to solve this, or
            is there another way to accomplish what i am trying to do?
            >
            Basically, you are trying to do two different things with the same type
            (int). One way would be to have 2 different functions, one with the
            VIPfunction, one without.
            >
            Another way would be to wrap A and B in a structure or class. Then you
            could make a func template and specialize for type B (which would be a
            structure).
            >
            The questionn becomes, they are both ints. Calling one A and one B in a
            typedef doesn't mean much. If you need to differentiate between them
            then
            just keep them straight yourself somehow.
            >
            I can see what you are trying to accomplish, but the question is why?
            How
            does this help your pogram? Depending on what you are actually trying to
            achieve would say how it could be done.
            >
            To clarify what i am doing, A represents a row number, and B
            represents a column number.
            In the good ol' game chess, rows have numbers (1234...), and columns
            have letters (ABCD...).
            Therefore the need to have them use different functons.
            >
            The already existing (C style) code assumes that A and B are ints, and
            uses memsets and memcopys everywhere.
            >
            A solution has sprung into my mind, but i dont know if its a very good
            one:
            >
            void func2(A val1, B val2 = -255)
            {
            if(val2 == -255)
            {
            VIPfunc();
            std::cout << val1 << std::endl;
            }
            else
            {
            std::cout << val2 << std::endl;
            }
            }
            >
            any comments on that?
            >
            In chess rows go from 1 to 8. Colums go from A to H. No other values are
            legitimate.
            >
            void func2(int Val )
            {
            if ( Val >=1 && Val <= 8 )
            // I have a row
            else if ( Val >= 'A' && Val <= 'H' )
            // I have a column
            else
            // Danger Will Roberson!
            >
            }
            There is just a minor problem... Both columns and rows are stored in
            the format 0 to 7.
            this so that they could be used like this: "theBoard[row][col]"

            :(

            Comment

            • =?ISO-8859-1?Q?Erik_Wikstr=F6m?=

              #7
              Re: Function Overloading Problem

              On 2007-04-01 15:51, Hayrola wrote:
              On 1 Apr, 06:00, "Jim Langston" <tazmas...@rock etmail.comwrote :
              >"Hayrola" <Niklas_Ha...@h ome.sewrote in message
              >>
              >news:117543161 3.662030.202900 @y66g2000hsf.go oglegroups.com. ..
              >>
              >>
              >>
              >I have two vaiable types, named A and B. These are of the same type,
              int, but their values must be treated differently before printing. eg:
              >>
              typedef int A;
              typedef int B;
              >>
              void func(A val)
              {
              VIPfunction(val );
              std::cout << val << std::endl;
              }
              >>
              void func(B val)
              { //Error points to this line
              std::cout << val << std::endl;
              }
              >>
              This gives me the following error: "function 'void func(A)' already
              has a body"
              >>
              Is there an easy way to solve this, or
              is there another way to accomplish what i am trying to do?
              >>
              >Basically, you are trying to do two different things with the same type
              >(int). One way would be to have 2 different functions, one with the
              >VIPfunction, one without.
              >>
              >Another way would be to wrap A and B in a structure or class. Then you
              >could make a func template and specialize for type B (which would be a
              >structure).
              >>
              >The questionn becomes, they are both ints. Calling one A and one B in a
              >typedef doesn't mean much. If you need to differentiate between them then
              >just keep them straight yourself somehow.
              >>
              >I can see what you are trying to accomplish, but the question is why? How
              >does this help your pogram? Depending on what you are actually trying to
              >achieve would say how it could be done.
              >
              To clarify what i am doing, A represents a row number, and B
              represents a column number.
              In the good ol' game chess, rows have numbers (1234...), and columns
              have letters (ABCD...).
              Therefore the need to have them use different functons.
              >
              The already existing (C style) code assumes that A and B are ints, and
              uses memsets and memcopys everywhere.
              >
              A solution has sprung into my mind, but i dont know if its a very good
              one:
              >
              void func2(A val1, B val2 = -255)
              This implies to me that you know at the time you make the call whether
              you have a row or a column, so why not simply make two different
              functions with different names?

              --
              Erik Wikström

              Comment

              • Jim Langston

                #8
                Re: Function Overloading Problem

                "Hayrola" <Niklas_Hayer@h ome.sewrote in message
                news:1175441258 .573915.208200@ p15g2000hsd.goo glegroups.com.. .
                On 1 Apr, 08:24, "Jim Langston" <tazmas...@rock etmail.comwrote :
                >"Hayrola" <Niklas_Ha...@h ome.sewrote in message
                >>
                >news:117543550 3.725600.286900 @b75g2000hsg.go oglegroups.com. ..
                >>
                >>
                >>
                On 1 Apr, 06:00, "Jim Langston" <tazmas...@rock etmail.comwrote :
                >"Hayrola" <Niklas_Ha...@h ome.sewrote in message
                >>
                >>news:11754316 13.662030.20290 0@y66g2000hsf.g ooglegroups.com ...
                >>
                >I have two vaiable types, named A and B. These are of the same type,
                int, but their values must be treated differently before printing.
                eg:
                >>
                typedef int A;
                typedef int B;
                >>
                void func(A val)
                {
                VIPfunction(val );
                std::cout << val << std::endl;
                }
                >>
                void func(B val)
                { //Error points to this line
                std::cout << val << std::endl;
                }
                >>
                This gives me the following error: "function 'void func(A)' already
                has a body"
                >>
                Is there an easy way to solve this, or
                is there another way to accomplish what i am trying to do?
                >>
                >Basically, you are trying to do two different things with the same
                >type
                >(int). One way would be to have 2 different functions, one with the
                >VIPfunction, one without.
                >>
                >Another way would be to wrap A and B in a structure or class. Then
                >you
                >could make a func template and specialize for type B (which would be a
                >structure).
                >>
                >The questionn becomes, they are both ints. Calling one A and one B in
                >a
                >typedef doesn't mean much. If you need to differentiate between them
                >then
                >just keep them straight yourself somehow.
                >>
                >I can see what you are trying to accomplish, but the question is why?
                >How
                >does this help your pogram? Depending on what you are actually trying
                >to
                >achieve would say how it could be done.
                >>
                To clarify what i am doing, A represents a row number, and B
                represents a column number.
                In the good ol' game chess, rows have numbers (1234...), and columns
                have letters (ABCD...).
                Therefore the need to have them use different functons.
                >>
                The already existing (C style) code assumes that A and B are ints, and
                uses memsets and memcopys everywhere.
                >>
                A solution has sprung into my mind, but i dont know if its a very good
                one:
                >>
                void func2(A val1, B val2 = -255)
                {
                if(val2 == -255)
                {
                VIPfunc();
                std::cout << val1 << std::endl;
                }
                else
                {
                std::cout << val2 << std::endl;
                }
                }
                >>
                any comments on that?
                >>
                >In chess rows go from 1 to 8. Colums go from A to H. No other values
                >are
                >legitimate.
                >>
                >void func2(int Val )
                >{
                > if ( Val >=1 && Val <= 8 )
                > // I have a row
                > else if ( Val >= 'A' && Val <= 'H' )
                > // I have a column
                > else
                > // Danger Will Roberson!
                >>
                >}
                >
                There is just a minor problem... Both columns and rows are stored in
                the format 0 to 7.
                this so that they could be used like this: "theBoard[row][col]"
                Then you need to either make two different functions, pass another parm
                stating what the variable type is, or modify the parm to say.

                The first method is rather obvoiu.

                void funcRow2( int Val );
                void funcCol2( int Val );

                The second method I would just pass a bool

                void func2( int Val, bool Row )
                {
                if ( Row )
                // working with row
                else
                // working with column
                }

                The third method is sloppy and kludge.

                void func2( int Val )
                {
                if ( Val 255 )
                {
                // Dealing with Row
                Val -= 255;
                }
                else
                // Dealing with Column
                }

                Would be used like:

                int Row, Col;
                cin >Row >Col;

                func2( Row + 255 );
                func2( Col );

                I am not suggesting you use the 2nd method, it's quite ugly and a kludge.
                But it is possible.

                Your last alternative would work, but I'd probably assign it a value of -1
                instead of -255.

                Overall, the best method if possible is to preprocess anythign you have to
                for row if you can.

                void Func2Row( int Val )
                {
                VIPfunc();
                Func2( Val );
                }

                void Func2Col( int Val )
                {
                Func2( Val );
                }

                void Func2( int Val )
                {
                // whatever
                }

                I still think the best solution would be to have one function for Row, and
                one function for Column, easiest to maintain.


                Comment

                • Hayrola

                  #9
                  Re: Function Overloading Problem

                  On 1 Apr, 13:21, "Jim Langston" <tazmas...@rock etmail.comwrote :
                  "Hayrola" <Niklas_Ha...@h ome.sewrote in message
                  >
                  news:1175441258 .573915.208200@ p15g2000hsd.goo glegroups.com.. .
                  >
                  >
                  >
                  On 1 Apr, 08:24, "Jim Langston" <tazmas...@rock etmail.comwrote :
                  "Hayrola" <Niklas_Ha...@h ome.sewrote in message
                  >
                  >news:117543550 3.725600.286900 @b75g2000hsg.go oglegroups.com. ..
                  >
                  On 1 Apr, 06:00, "Jim Langston" <tazmas...@rock etmail.comwrote :
                  "Hayrola" <Niklas_Ha...@h ome.sewrote in message
                  >
                  >news:117543161 3.662030.202900 @y66g2000hsf.go oglegroups.com. ..
                  >
                  I have two vaiable types, named A and B. These are of the same type,
                  int, but their values must be treated differently before printing.
                  eg:
                  >
                  typedef int A;
                  typedef int B;
                  >
                  void func(A val)
                  {
                  VIPfunction(val );
                  std::cout << val << std::endl;
                  }
                  >
                  void func(B val)
                  { //Error points to this line
                  std::cout << val << std::endl;
                  }
                  >
                  This gives me the following error: "function 'void func(A)' already
                  has a body"
                  >
                  Is there an easy way to solve this, or
                  is there another way to accomplish what i am trying to do?
                  >
                  Basically, you are trying to do two different things with the same
                  type
                  (int). One way would be to have 2 different functions, one with the
                  VIPfunction, one without.
                  >
                  Another way would be to wrap A and B in a structure or class. Then
                  you
                  could make a func template and specialize for type B (which would be a
                  structure).
                  >
                  The questionn becomes, they are both ints. Calling one A and one B in
                  a
                  typedef doesn't mean much. If you need to differentiate between them
                  then
                  just keep them straight yourself somehow.
                  >
                  I can see what you are trying to accomplish, but the question is why?
                  How
                  does this help your pogram? Depending on what you are actually trying
                  to
                  achieve would say how it could be done.
                  >
                  To clarify what i am doing, A represents a row number, and B
                  represents a column number.
                  In the good ol' game chess, rows have numbers (1234...), and columns
                  have letters (ABCD...).
                  Therefore the need to have them use different functons.
                  >
                  The already existing (C style) code assumes that A and B are ints, and
                  uses memsets and memcopys everywhere.
                  >
                  A solution has sprung into my mind, but i dont know if its a very good
                  one:
                  >
                  void func2(A val1, B val2 = -255)
                  {
                  if(val2 == -255)
                  {
                  VIPfunc();
                  std::cout << val1 << std::endl;
                  }
                  else
                  {
                  std::cout << val2 << std::endl;
                  }
                  }
                  >
                  any comments on that?
                  >
                  In chess rows go from 1 to 8. Colums go from A to H. No other values
                  are
                  legitimate.
                  >
                  void func2(int Val )
                  {
                  if ( Val >=1 && Val <= 8 )
                  // I have a row
                  else if ( Val >= 'A' && Val <= 'H' )
                  // I have a column
                  else
                  // Danger Will Roberson!
                  >
                  }
                  >
                  There is just a minor problem... Both columns and rows are stored in
                  the format 0 to 7.
                  this so that they could be used like this: "theBoard[row][col]"
                  >
                  Then you need to either make two different functions, pass another parm
                  stating what the variable type is, or modify the parm to say.
                  >
                  The first method is rather obvoiu.
                  >
                  void funcRow2( int Val );
                  void funcCol2( int Val );
                  >
                  The second method I would just pass a bool
                  >
                  void func2( int Val, bool Row )
                  {
                  if ( Row )
                  // working with row
                  else
                  // working with column
                  >
                  }
                  >
                  The third method is sloppy and kludge.
                  >
                  void func2( int Val )
                  {
                  if ( Val 255 )
                  {
                  // Dealing with Row
                  Val -= 255;
                  }
                  else
                  // Dealing with Column
                  >
                  }
                  >
                  Would be used like:
                  >
                  int Row, Col;
                  cin >Row >Col;
                  >
                  func2( Row + 255 );
                  func2( Col );
                  >
                  I am not suggesting you use the 2nd method, it's quite ugly and a kludge.
                  But it is possible.
                  >
                  Your last alternative would work, but I'd probably assign it a value of -1
                  instead of -255.
                  >
                  Overall, the best method if possible is to preprocess anythign you have to
                  for row if you can.
                  >
                  void Func2Row( int Val )
                  {
                  VIPfunc();
                  Func2( Val );
                  >
                  }
                  >
                  void Func2Col( int Val )
                  {
                  Func2( Val );
                  >
                  }
                  >
                  void Func2( int Val )
                  {
                  // whatever
                  >
                  }
                  >
                  I still think the best solution would be to have one function for Row, and
                  one function for Column, easiest to maintain.
                  Yes, i tink il'l go for two differently named functions.
                  Thanks Jim and Erik for great answers!

                  Comment

                  Working...