Есть ли обходной путь для этого предупреждения о времени соединения C4702?
Я использую Boost:: вариант и у меня проблемы с компиляцией в режиме релиза. Я работаю в VC2010 с уровнем предупреждения 4 и предупреждениями как ошибки. Приведенный ниже код прекрасно компилируется в режиме отладки, но в режиме выпуска я получаю кучу предупреждений C4702 "Недоступный код", отправляемых во время соединения (предположительно, здесь я получаю предупреждения компилятора, потому что при включенной оптимизации генерируется код времени соединения).
Кто-нибудь успешно отключил эти предупреждения в этой ситуации? Я бы предпочел сохранить высокий уровень предупреждений и предупреждений как ошибки, если это возможно.
#pragma warning( disable:4702 )
... кажется, не работает здесь. Вот пример кода:
#include <boost/variant.hpp>
struct null{};
typedef boost::variant< null, double > variant_t;
class addition_visitor
: public boost::static_visitor< variant_t >
{
public:
template< typename T, typename U >
variant_t operator()( const T&, const U& ) const
{
throw( "Bad types" );
}
variant_t operator()( const double& left, const double& right ) const
{
return variant_t( left * right );
}
};
int main(int /*argc*/, char** /*argv*/)
{
variant_t a( 3.0 ), b( 2.0 );
variant_t c = boost::apply_visitor( addition_visitor(), a, b );
return 0;
}
Предупреждение вызывается шаблонным оператором (), который я использую для отлова попыток применить посетителя к неверным типам вариантов.
6 ответов
У меня была очень похожая проблема в проекте Visual Studio 2012 MFC; то же самое предупреждение пришло из заголовочного файла
Я решил это, добавив предупреждение #pragma (disable:4702) в начале предварительно скомпилированного заголовочного файла (в моем случае"stdafx.h", перед #include заголовочными файлами STL).
Зачем вообще предоставлять тело для оператора шаблона?
У меня нет под рукой Boost, так что я не могу проверить вас, но тот факт, что шаблонный оператор имеет тело, скорее всего, означает, что любые и все вызовы, независимо от типа, скомпилируются нормально, а затем выдают ошибку во время выполнения.,
Не указывайте тело оператора шаблона, и он просто откажется ссылаться при использовании с любым другим типом, кроме double.
#Pragma не работает, потому что это время ссылки, а не предупреждение о времени компиляции.
Вы можете подавить предупреждение в режиме выпуска. Я считаю / игнорировать: хххх в командной строке компоновщика добьется цели.
После обеда и прогулки у меня есть неудовлетворительный, но работающий обходной путь. Вместо того, чтобы возвращать вариант от моего посетителя и выдавать сообщение об ошибке, я возвращаю логическое значение успеха и сохраняю результат, таким образом:
#include <boost/variant.hpp>
struct null{};
typedef boost::variant< null, double > variant_t;
class addition_visitor
: public boost::static_visitor< bool >
{
public:
template< typename T, typename U >
bool operator()( const T&, const U& )
{
//throw( "Bad types" );
return false;
}
bool operator()( const double& left, const double& right )
{
result = variant_t( left * right );
return true;
}
variant_t result;
};
int main(int /*argc*/, char** /*argv*/)
{
variant_t a( 3.0 ), b( 2.0 );
addition_visitor v;
if( !boost::apply_visitor( v, a, b ) )
{
throw( "Bad types" );
}
variant_t c = v.result;
return 0;
}
Если я объявляю метод non-double, но не предоставляю реализацию, я получаю "неразрешенную внешнюю" ошибку компоновщика.
Попробуй добавить inline
спецификатор в определении оператора шаблона. Тогда MSVC не нужно, чтобы его тело компилировало сам класс. Так что вместо unresolved external
вы будете получать ошибки во время компиляции только тогда, когда ваш код попытается использовать этот шаблон. Как я понимаю - это именно то, что вы хотите.
Сделать шаблон operator()(...)
частный и не обеспечивают реализацию. Это поймает использование этого во время компиляции вместо времени ссылки.