为什么不嵌套构造函数调用编译?

时间:2014-06-04 12:28:37

标签: c++

为什么以下不编译:

typedef int Table;

class FullObjId 
{
public:
    explicit FullObjId( const Table* i ) {}
};

class TableInfo 
{
public:
    TableInfo( const FullObjId& o ) {}
    bool isValid() { return true; }
};

void dataSourceForHist( const Table& table )
{
   // The next line gives an error
   TableInfo tableInfo( FullObjId( &table ) );
   // Unless it's written like this:
   //TableInfo tableInfo( ( FullObjId( &table ) ) );

   if (!tableInfo.isValid())
   {
      ...
   }
}

我尝试使用适用于Linux的英特尔编译器12.1,并使用http://gcc.godbolt.org/和g ++ 4.8,icc 13.0,clang 3.4.1。 我尝试过的所有编译器都会出现错误:

error: request for member ‘isValid’ in ‘tableInfo’, which is of non-class type ‘TableInfo(FullObjId&)’

2 个答案:

答案 0 :(得分:0)

问题(也称为最令人烦恼的解析)依赖于以下事实:

TableInfo tableInfo( FullObjId( &table ) );

is interpreted as a function声明。

假设您使用的是C ++ 11,则应使用:

TableInfo tableInfo{ FullObjId( &table ) };

Live demo

代替。

或者你可以添加额外的括号(适用于C ++ 03):

TableInfo tableInfo( (FullObjId( &table )) );

Live demo

答案 1 :(得分:0)

TableInfo tableInfo( FullObjId( &table ) );

声明tableInfo是一个函数,它引用FullObjId(参数名称为table)并返回TableInfo。这就是所谓的most vexing parse

使用C ++ 11解决方法:

TableInfo tableInfo( FullObjId{&table} );