Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Most vexing parse

I got the code from here.

class Timer {  public:   Timer(); };  class TimeKeeper {  public:   TimeKeeper(const Timer& t);    int get_time()   {       return 1;   } };  int main() {   TimeKeeper time_keeper(Timer());   return time_keeper.get_time(); } 

From the looks of it, it should get compile error due to the line:

TimeKeeper time_keeper(Timer()); 

But it only happens if return time_keeper.get_time(); is present.

Why would this line even matter, the compiler would spot ambiguity on time_keeper(Timer() ) construction.

like image 239
Shamim Hafiz - MSFT Avatar asked May 08 '11 07:05

Shamim Hafiz - MSFT


1 Answers

This is due to the fact that TimeKeeper time_keeper(Timer()); is interpreted as a function declaration and not as a variable definition. This, by itself, is not an error, but when you try to access the get_time() member of time_keeper (which is a function, not a TimeKeeper instance), your compiler fails.

This is how your compiler view the code:

int main() {   // time_keeper gets interpreted as a function declaration with a function argument.   // This is definitely *not* what we expect, but from the compiler POV it's okay.   TimeKeeper time_keeper(Timer (*unnamed_fn_arg)());    // Compiler complains: time_keeper is function, how on earth do you expect me to call   // one of its members? It doesn't have member functions!   return time_keeper.get_time(); } 
like image 88
Boaz Yaniv Avatar answered Oct 04 '22 18:10

Boaz Yaniv