Connecting Tech Pros Worldwide Help | Site Map

Variable declaration taken as a function pointer declaration

  #1  
Old December 2nd, 2005, 04:05 PM
Bolin
Guest
 
Posts: n/a
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.

  #2  
Old December 2nd, 2005, 04:35 PM
Victor Bazarov
Guest
 
Posts: n/a

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
  #3  
Old December 2nd, 2005, 04:35 PM
deane_gavin@hotmail.com
Guest
 
Posts: n/a

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

  #4  
Old December 2nd, 2005, 04:55 PM
Bolin
Guest
 
Posts: n/a

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.

  #5  
Old December 2nd, 2005, 05:35 PM
deane_gavin@hotmail.com
Guest
 
Posts: n/a

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

http://www.gotw.ca/gotw/075.htm

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

Gavin Deane

Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
pointer to function in constructor Mad Ant answers 3 August 25th, 2008 04:15 AM
Array of pointer in C# Kathy Tran answers 7 November 16th, 2005 07:30 PM
Pointer Declaration/Array definition ur8x@ur8x.com answers 12 November 14th, 2005 11:59 AM
comp.lang.c Answers to Frequently Asked Questions (FAQ List) Steve Summit answers 0 November 13th, 2005 03:15 AM