Есть ли обходной путь для этого предупреждения о времени соединения C4702? - PullRequest
14 голосов
/ 01 апреля 2011

Я использую 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 ]

1 голос
/ 27 сентября 2013

У меня была очень похожая проблема в проекте Visual Studio 2012 MFC;то же самое предупреждение пришло из заголовочного файла , также во время генерации временного кода ссылки Release .Я решил это, добавив # pragma warning (отключить: 4702) в начале скомпилированного заголовочного файла ( "stdafx.h" в моем случае, непосредственно перед #, включая файлы заголовков STL).

1 голос
/ 05 апреля 2011

#pragma не работает, потому что это время ссылки, а не предупреждение о времени компиляции.

Вы можете отключить предупреждение в режиме разблокировки.Я верю / игнорирую: xxxx в командной строке компоновщика добьется цели.

1 голос
/ 05 апреля 2011

Зачем вообще предоставлять тело для оператора шаблона?

У меня нет Boost под рукой, поэтому я не могу проверить вас, но тот факт, что шаблонный оператор имеет тело, скорее всего, означает, что любой и все вызовы, независимо от типа, будут хорошо скомпилированы, а затем выдают ошибка во время выполнения.

Не указывать тело оператора шаблона, и он просто откажется ссылаться при использовании с любым другим типом, кроме double.

1 голос
/ 01 апреля 2011

После обеда и прогулки у меня есть неудовлетворительный, но работающий обходной путь.Вместо того, чтобы возвращать вариант от моего посетителя и выдавать ошибку, я возвращаю логическое значение успеха и сохраняю результат, таким образом:

#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;
}
0 голосов
/ 05 апреля 2011

Сделайте шаблон operator()(...) закрытым и не предоставляйте реализацию.Это позволит использовать его во время компиляции, а не во время компоновки.

0 голосов
/ 05 апреля 2011

Если я объявлю метод non-double, но не обеспечить реализацию, то я получить «неразрешенный внешний» компоновщик ошибка.

Попробуйте добавить спецификатор inline в определении оператора шаблона. Тогда MSVC не нужно, чтобы его тело компилировало сам класс. Поэтому вместо unresolved external вы будете получать ошибки во время компиляции только тогда, когда ваш код пытается использовать этот шаблон. Как я понимаю - это именно то, что вы хотите.

...