Variable declaration taken as a function pointer declaration

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

    #1

    Variable declaration taken as a function pointer declaration

    When compiling the following code:

    [code]
    #include <iostream>

    struct B {};

    struct A
    {
    A(B b1, B b2) {};
    void foo() { std::cout << "foo called" << std::endl; }
    };

    int main(int argc, char * argv[])
    {
    A a(B(), B());
    a.foo();
    return 0;
    }
    [\code]

    the compiler will interprete the first line of the main function as a
    function pointer declaration, and thus will fail at the next line. Does
    somebody know why this is so, and if there is an elegant way to solve
    this problem that does not involve temporary variables?

    B.

  • Victor Bazarov

    #2
    Re: Variable declaration taken as a function pointer declaration

    Bolin wrote:[color=blue]
    > When compiling the following code:
    >
    > [code]
    > #include <iostream>
    >
    > struct B {};
    >
    > struct A
    > {
    > A(B b1, B b2) {};[/color]
    .. ^^^
    Trailing semicolon is extraneous here.
    [color=blue]
    > void foo() { std::cout << "foo called" << std::endl; }
    > };
    >
    > int main(int argc, char * argv[])
    > {
    > A a(B(), B());
    > a.foo();
    > return 0;
    > }
    > [\code]
    >
    > the compiler will interprete the first line of the main function as a
    > function pointer declaration, and thus will fail at the next line. Does
    > somebody know why this is so, and if there is an elegant way to solve
    > this problem that does not involve temporary variables?[/color]

    It is so because the language designers had to make a decision and they
    picked the "If it looks like a declaration, it is a declaration" solution.

    You can work around it by adding an extra set of parentheses around the
    arguments:

    A a((B()), (B()));

    V

    Comment

    • deane_gavin@hotmail.com

      #3
      Re: Variable declaration taken as a function pointer declaration


      Bolin wrote:[color=blue]
      > When compiling the following code:
      >
      > [code]
      > #include <iostream>
      >
      > struct B {};
      >
      > struct A
      > {
      > A(B b1, B b2) {};
      > void foo() { std::cout << "foo called" << std::endl; }
      > };
      >
      > int main(int argc, char * argv[])
      > {
      > A a(B(), B());
      > a.foo();
      > return 0;
      > }
      > [\code]
      >
      > the compiler will interprete the first line of the main function as a
      > function pointer declaration, and thus will fail at the next line. Does
      > somebody know why this is so, and if there is an elegant way to solve
      > this problem that does not involve temporary variables?[/color]

      It is so because your code could either be read as a function
      declaration or a variable definition and the rule to disambiguate this
      is "if it could be a function declaration, it is a function
      declaration". The solution is to change the line that defines a to

      A a((B()), (B()));

      Gavin Deane

      Comment

      • Bolin

        #4
        Re: Variable declaration taken as a function pointer declaration

        Thanks for your answer and your solution -- the thing that surprised me
        is that a bare B() could be interpreted as a function pointer.

        B.

        Comment

        • deane_gavin@hotmail.com

          #5
          Re: Variable declaration taken as a function pointer declaration


          Bolin wrote:[color=blue]
          > Thanks for your answer and your solution -- the thing that surprised me
          > is that a bare B() could be interpreted as a function pointer.[/color]

          Take a look at



          particularly the logic up to examples 2d and 2e.

          Gavin Deane

          Comment

          Working...