Consider this very simple code:
#include <memory>
class Foo
{
public:
Foo() {};
};
class Bar
{
public:
Bar( const std::shared_ptr<Foo>& foo ) {}
};
int main()
{
Foo* foo = new Foo;
Bar bar( std::shared_ptr<Foo>( foo ) );
return 0;
}
Why does Visual Studio reports
warning C4930: 'Bar bar(std::shared_ptr<Foo>)': prototyped function not called (was a variable definition intended?)
and there is no bar
object created...how can this line Bar bar( std::shared_ptr<Foo>( foo ) );
be interpreted as a function definition?
I checked Do the parentheses after the type name make a difference with new? and also C++: warning: C4930: prototyped function not called (was a variable definition intended?), but I feel my problem is different here as I did not use the syntax Foo()
nor Bar()
.
Edit: Note that it successfully compiles:
Foo* foo = new Foo;
std::shared_ptr<Foo> fooPtr( foo );
Bar bar( fooPtr );
This issue is about C++'s most vexing parse. The statement:
declares a function called
bar
that returnsBar
and takes an argument calledfoo
of typestd::shared_ptr<Foo>
.The innermost parenthesis have no effect. It is as if you would have written the following:
Assuming C++11 (since you are already using
std::shared_ptr
) you could use the brace syntax instead of parenthesis:This would actually construct an object
bar
of typeBar
, since the statement above can't be interpreted as a declaration because of the braces.