为什么以下不编译:
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&)’
答案 0 :(得分:0)
问题(也称为最令人烦恼的解析)依赖于以下事实:
TableInfo tableInfo( FullObjId( &table ) );
is interpreted as a function声明。
假设您使用的是C ++ 11,则应使用:
TableInfo tableInfo{ FullObjId( &table ) };
代替。
或者你可以添加额外的括号(适用于C ++ 03):
TableInfo tableInfo( (FullObjId( &table )) );
答案 1 :(得分:0)
TableInfo tableInfo( FullObjId( &table ) );
声明tableInfo
是一个函数,它引用FullObjId
(参数名称为table
)并返回TableInfo
。这就是所谓的most vexing parse。
使用C ++ 11解决方法:
TableInfo tableInfo( FullObjId{&table} );