Ошибка внутреннего компилятора и повышение :: Bind

StackOverflow https://stackoverflow.com/questions/2380839

  •  24-09-2019
  •  | 
  •  

Вопрос

Я проверяю класс C ++ с рядом функций, которые все имеют в основном одинаковую форму:

ClassUnderTest t;

DATATYPE data = { 0 };
try
{
    t.SomeFunction( &data );
}
catch( const SomeException& e )
{
    // log known error
}
catch( ... )
{
    // log unknown error
}

Так как есть много из них, я думал, что написал функцию, чтобы сделать большую часть тяжелой подъема:

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 ) ) );

Но, кажется, компилятор не согласны со мной, что это хорошая идея ...

Warning 1   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\bind.hpp   1657
Warning 2   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 318
Warning 3   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 326
Warning 4   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 331
Warning 5   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 345
Warning 6   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 350
Warning 7   warning C4180: qualifier applied to function type has no meaning; ignored   c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 362
Error   8   fatal error C1001: An internal error has occurred in the compiler.  c:\boost\boost_1_41_0\boost\bind\mem_fn.hpp 328

Я использую Visual Studio 2008 SP1. Если кто-то может указать на то, что я делаю не так, я был бы признателен.

Спасибо, Польх

Это было полезно?

Решение

Ошибка в вашем коде, а не в bind. Отказ Вы проходите функтор, который не ожидает никаких аргументов. Вместо вашего звонка сделать

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

Если вы опускаете _1 тогда bind создаст объект функции нулевого аргумента, а функция элементов (которая ожидает указателя данных) пропустит один аргумент при вызова bind.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top