编译器在构造函数上抱怨BOOST_CHECK_THROW

时间:2010-03-03 14:26:44

标签: c++ constructor default-constructor boost-test

以下内容无法编译:

class Foo {
public:
    Foo( boost::shared_ptr< Bar > arg );
};

// in test-case

boost::shared_ptr< Bar > bar;

BOOST_CHECK_THROW( Foo( bar ), std::logic_error ); // compiler error here

Bar的实施并不重要。编译器抱怨说,Foo没有合适的默认构造函数(VC ++ 2005)。如果我添加一个默认构造函数,它就可以工作,并且它实际上被调用了。为什么这个语句需要一个默认的构造函数?

1 个答案:

答案 0 :(得分:12)

这是因为BOOST_CHECK_THROW是一个宏,而Foo(bar)正在扩展为一个语句。编译器看到这个语句并将其解释为变量声明Foo bar;,它需要一个默认的构造函数。

解决方案是为变量命名:

BOOST_CHECK_THROW( Foo temp( bar ), std::logic_error );

换句话说,BOOST_CHECK_THROW将扩展为类似

的内容
try
{
    Foo(bar);
    // ... fail test ...
}
catch( std::logic_error )
{
    // ... pass test ...
}

并且编译器将Foo(bar);解释为名为bar的变量的声明。可以通过一个简单的程序来检查:

struct Test
{
    Test(int *x) {}
};

int main()
{
    int *x=0;
    Test(x);
    return 0;
}

使用g ++

给出以下错误
test.cpp: In function ‘int main()’:
test.cpp:10: error: conflicting declaration ‘Test x’
test.cpp:9: error: ‘x’ has a previous declaration as ‘int* x’