内部编译器错误和boost::bind 我正在测试一个C++类,它具有许多基本上相同的函数: ClassUnderTest t; DATATYPE data = { 0 }; try { t.SomeFunction( &data ); } catch( const SomeException& e ) { // log known error } catch( ... ) { // log unknown error }

内部编译器错误和boost::bind 我正在测试一个C++类,它具有许多基本上相同的函数: ClassUnderTest t; DATATYPE data = { 0 }; try { t.SomeFunction( &data ); } catch( const SomeException& e ) { // log known error } catch( ... ) { // log unknown error },c++,boost,bind,c1001,C++,Boost,Bind,C1001,因为有很多这样的函数,我想我应该写一个函数来完成大部分的繁重工作: template< typename DATA, typename TestFunction > int DoTest( TestFunction test_fcn ) { DATA data = { 0 }; try { test_fcn( &data ); } catch( const SomeException& e ) {

因为有很多这样的函数,我想我应该写一个函数来完成大部分的繁重工作:

template< typename DATA, typename TestFunction >
int DoTest( TestFunction test_fcn )
{
    DATA data = { 0 };
    try
    {
        test_fcn( &data );
    }
    catch( const SomeException& e )
    {
        // log known error
        return FAIL;
    }
    catch( ... )
    {
        // log unknown error
        return FAIL;
    }
    return TRUE;
}

ClassUnderTest t;
DoTest< DATATYPE >( boost::bind( &ClassUnderTest::SomeFunction, boost::ref( t ) ) );
我正在使用VisualStudio2008SP1。 如果有人能指出我做错了什么,我将不胜感激

谢谢,
PaulH

错误在您的代码中,而不是在
bind
中。传递一个不需要任何参数的函子。不要打你的电话,而是去做

DoTest< DATATYPE >( boost::bind( &ClassUnderTest::SomeFunction, &t, _1) );
DoTest(boost::bind(&classunderest::SomeFunction,&t,_1));

如果省略
\u 1
,则
bind
将创建一个零参数函数对象,成员函数(需要数据指针)在被
bind
调用时将丢失一个参数

我可以忽略这些警告,但我希望无论我能做什么来修复这些警告,都能产生不会使编译器崩溃的代码。那么,有没有办法使这个C++03有效呢?@PaulH,我对
bind
的了解还不足以说明它是如何在内部工作的,对MSVC++的了解也不足以说明它为什么会崩溃。我很抱歉。也许另一个可以在这方面提供更多的信息。可能尝试传递
&t
而不是
ref(t)
,或者尝试传递
boost::mem\u fn(&Class::Function)
以绑定的第一个参数,而不是直接传递
&Class::Function
。@Johannes Schaub-我按照您的建议更改为使用boost::mem\u fn()。编译器崩溃和警告被替换为行
fcn(&data)
Bind.hpp(236)项的单个erorr。hpp(236)项不会计算为带1个参数的函数。
有什么想法吗?@PaulH,当然有。您必须告诉
bind
它仍然需要一个参数。因此,您需要通过
\u 1
此外:
绑定(&classunderest::SomeFunction,&t,\u 1)
。如果省略
\u 1
,则无法通过传递参数来调用生成的函数对象。
DoTest< DATATYPE >( boost::bind( &ClassUnderTest::SomeFunction, &t, _1) );