如何摆脱VS2008中boost :: flyweight产生的C4800警告

时间:2009-10-08 11:14:38

标签: c++ mfc boost compiler-warnings

在打开MFC的VS2008中编译下面的代码时,我收到警告。提升版本1.39


include "boost/flyweight.hpp"
include "boost/flyweight/key_value.hpp"
class Foo
{
  public:
    Foo(const CString& item) : mfoo(item) {}
    const CString& getkeyvalue() const {return mfoo;}
  private:
    const CString mfoo;
};
struct Conversion
{
  const CString& operator() (const Foo& item) const {return item.getkeyvalue();}
};  

using namespace boost::flyweights;
flyweight<key_value<CString, Foo, Conversion>, tag<Foo> > flyweight_test;

上述代码中的最后一行产生警告

d:\ work \ sourcecode \ boost1390 \ boost \ functional \ hash \ extensions.hpp(72):警告C4800:'const wchar_t *':强制值为bool'true'或'false'(性能警告)<登记/> d:\ work \ sourcecode \ boost1390 \ boost \ functional \ hash \ extensions.hpp(71):同时编译类模板成员函数size_t boost::hash<T>::operator ()(const T &) const        [
          T=ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t>>
       ]
d:\ work \ sourcecode \ boost1390 \ boost \ multi_index \ hashedindex.hpp(1159):参见类模板实例化'boost :: hash&lt; T&gt;'正在编译        [
          T=ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t>>
       ]

此警告通过哈希工厂,MPL等继续进行。

为什么警告在那里以及如何更正代码以便不产生警告?

编辑:
要修复,请添加以下hash_value

的实现

template<typename CharType, typename TraitsType>
std::size_t hash_value(const ATL::CStringT<CharType, TraitsType>& s)
{
    return CStringElementTraits<typename TraitsType>::Hash(s);
}

5 个答案:

答案 0 :(得分:3)

我用/ Wall编译,导致Boost生成各种警告。此外,我指示编译器将所有警告视为错误,因此根本不需要警告。

为了避免在编译Boost标头时收到任何警告,我使用#pragma warning暂时降低警告级别,并在处理Boost标头时关闭所有剩余警告:

// set minimal warning level
#pragma warning(push,0)
// some warnings still occur at this level
// if necessary, disable specific warnings not covered by previous pragma
#pragma warning(disable:4800)

#include 

// restore warning level
#pragma warning(pop)

这确保我的代码编译时可以进行最高级别的错误检查,而我无法控制的代码仍然可以成功编译。

我能看到的唯一其他选项是忽略警告或维护Boost代码的修补版本,直到这些警告被修复,这两种警告都没有吸引力。

答案 1 :(得分:3)

当必须将int表达式转换为bool时,编译器会发出C4800警告。

E.g。 :

int k = 11;
bool f()
{ return k; }

int表达式k,从

的内部定义转换而来
k == 0 => *false*
k != 0 => *true*

bool

的定义
b == false (internally == 0) => *false*
b == true  (internally == 1) => *true*

因为任何值(除0之外)可能代表C ++中的 true ,编译器必须将k转换为bool。

正如警告所述,这种转换可能会带来性能损失。

注意:这个警告可能有点多余,因为编译器通常从代码中提取正确的含义,并将其优化掉。

编译器将根据我的示例代码创建的伪C代码:

char f()
{
    if( k )
       return (char) 1;
    return (char) 0;
}

答案 2 :(得分:2)

flyweight中的一个类可能使用hash_value函数(或包装类哈希)来计算来自ATL :: CString的哈希值。这不是直接在boost中定义的,因此您需要提供一个实现:

std::size_t hash_value(const ATL::CString& s)
{
     // ...
}

只看你的编译器输出,似乎CString本身是模板化的,所以你要实现

template<typename CharType, typename TraitsType>
std::size_t hash_value(const ATL::CString<CharType, TraitsType>& s)
{
     // calculate hash e.g. by calling hash_value(const std::string&)
}

答案 3 :(得分:0)

我不知道如何纠正该警告,但您可以通过将以下代码添加到您的cpp文件来关闭它:

#pragma warning(disable:4800)

请查看MSDN以获取进一步的参考。

答案 4 :(得分:0)

警告的来源不在您的代码中。你必须修复有问题的Boost代码。