我正在使用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()触发的,我用它来捕捉将访问者应用于不良变体类型的尝试。
答案 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()(...)
设为私有,并且不提供实现。这将在编译时捕获它的使用而不是链接时间。