BOOST_FOREACH和cxxtest插件的铸造问题

Casting problems with BOOST_FOREACH and cxxtest plugin

本文关键字:问题 插件 cxxtest FOREACH BOOST      更新时间:2023-10-16

我目前正在进行一个项目,我使用的是:

  • boost库v1.39
  • Eclipse CDT(Juno)和Cygwin
  • CxxTest插件:http://wiki.web-cat.org/WCWiki/EclipsePlugins/CxxTestPlugin

我遇到了一个关于CCD_ 1的问题。我到处搜索,都找不到可以帮助我的在线资源。当我在测试方法中调用BOOST_FOREACH时,问题就会出现。我一直得到以下错误:

/usr/include/boost/foreach.hpp: In member function 
'boost::foreach_detail_::rvalue_probe<T>::operator T&() const [with T = 
boost::unordered_map<std::basic_string<char>, std::basic_string<char> >]':
...   instantiated from here /usr/include/boost/foreach.hpp:476:90: 
error: invalid cast from type 
Dereferee::const_cast_helper<boost::foreach_detail_::rvalue_probe<boost::unordered_map<std
::basic_string<char>, std::basic_string<char> > >*> 
to type 'boost::unordered_map<std::basic_string<char>, std::basic_string<char> >*

const_cast_helper

我开始分析这个问题,发现const_cast运算符被重载是为了进行一些运行时检查,我不知道是什么。总之,有一个Dereferee::const_cast_helper是cxxtest依赖项的一部分,它是const_cast运算符的重载。

此助手取消定义const_cast运算符(!)

#ifdef const_cast
#undef const_cast
#endif

最后重新引入const_cast运算符:

#define const_cast ::Dereferee::const_cast_helper

因此,每次调用const_cast时,都会调用该助手的相应构造函数。构造函数接受指针、引用、常量指针和常量引用。

来源如下:https://github.com/web-cat/dereferee-with-cxxtest/blob/master/Dereferee/include/dereferee/const_cast.h

右价

Boost还处理强制转换,以查看正在迭代的集合是左值还是右值,从而避免复制它/重新计算表达式。

编译器抱怨以下内容:

template<typename T>
struct rvalue_probe
{
    ...
    operator T &() const { return *reinterpret_cast<T *>(const_cast<rvalue_probe *>(this)); }
};

在我的例子中,T是boost::unordered_map,不知何故,这个强制转换和辅助对象的重载的组合中断了。。。

解决方法

我研究了可能的解决方案,但我不知道如何真正实现它们,我没有那么多C++经验。我一点也不在乎我的测试中是否会有这些编译时检查,我可以解决这个问题。所以,在这三个方向中的任何一个方向上的任何帮助都将是最有帮助的!

  1. 禁用boost的右值检查,玩boost_WORKAROUND和foreach.hpp 中定义的文字

    BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTIONBOOST_FOREACH_NO_RVALUE_DETECTIONBOOST_FOREACH_NO_CONST_RVALUE_DETECTIONBOOST_FOREACH_RUN_TIME_CONST_RVALUE_DETECTION

  2. 禁用此const_cast_helper。当我运行我的测试程序(与测试项目不同的项目)时,我的代码按预期编译和运行,const_cast的过载会产生问题。

  3. 实现一个可以修复此错误的扩展。我不知道是应该在const_cast_helper还是rvalue_probe中进行,但没有任何好处。

template <typename T> const_cast_helper(rvalue_probe<U>* value_to_cast) : cast_value(const_cast<U*>(value_to_cast)) { }

感谢您提前提供的意见!

经过进一步的挖掘,我设法找到了一个解决方法。我在构建配置中定义了一个符号DEREFEREE_NO_CONST_CAST。这阻止了const_cast0的编译。希望不会有错误出现,测试现在正在运行。。。