这个C4702链路时间警告是否有解决方法?

时间:2011-04-01 11:10:50

标签: c++ visual-studio-2010 compiler-warnings suppress-warnings

我正在使用boost :: variant,但在发布模式下编译时遇到问题。我在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;
}

警告是由模板化的operator()触发的,我用它来捕捉将访问者应用于不良变体类型的尝试。

6 个答案:

答案 0 :(得分:1)

经过一顿午餐和散步之后,我有一个不满意但功能正常的解决方案。我没有从访问者返回变体并抛出错误,而是返回成功布尔值并存储结果,因此:

#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;
}

答案 1 :(得分:1)

为什么要为模板操作符提供一个主体?

我没有Boost方便,所以我无法检查你,但模板化运算符有一个主体的事实很可能意味着任何和所有调用,无论类型,将编译正常,然后扔一个运行时出错。

保留模板操作符的主体,当它与double之外的任何其他类型一起使用时,它将简单地拒绝链接。

答案 2 :(得分:1)

#pragma不起作用,因为这是链接时间而不是编译时警告。

您可以在发布模式下取消警告。我相信/忽略:链接器命令行上的xxxx可以解决问题。

答案 3 :(得分:1)

我在Visual Studio 2012 MFC项目中遇到了类似的问题;同样的警告来自&lt; memory&gt; 头文件,同样在发布链接时间代码生成期间。 我通过在预编译的头文件中添加 #pragma warning(disable:4702)来解决它(在我的情况下,“stdafx.h”,就在之前#including STL头文件。)

答案 4 :(得分:0)

  

如果我声明非双重方法但是   我不提供实施   得到一个“未解析的外部”链接器   错误。

尝试在模板运算符定义中添加inline说明符。那么MSVC不应该需要它的主体来编译类本身。因此,只有当您的代码尝试使用此模板时,您才会获得编译时错误,而不是unresolved external。据我所知 - 这正是你想要的。

答案 5 :(得分:0)

将模板operator()(...)设为私有,并且不提供实现。这将在编译时捕获它的使用而不是链接时间。