6

以下不编译:

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)。如果我添加一个默认构造函数,它会起作用,并且实际上会被调用。为什么这个语句需要一个默认构造函数?

4

1 回答 1

13

发生这种情况是因为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’
于 2010-03-03T14:33:10.357 回答