我目前正在使用的项目:

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

  • 而且我遇到了有关const_cast的问题。我搜索过很多东西,没有找到任何可以帮助我的在线资源。当我在测试方法中调用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运算符的重载。

    该助手 undefined const_cast运算符(!)
    #ifdef const_cast
    #undef const_cast
    #endif
    

    最后,重新引入const_cast运算符:
    #define const_cast ::Dereferee::const_cast_helper
    这样,每次调用const_cast时,都会调用此助手的适当构造函数。构造函数接受指针,引用,const指针和const引用。

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

    rvalue_probe

    为了避免复制它/重新计算表达式,Boost还使用强制转换来查看被迭代的集合是左值还是右值。

    编译器抱怨以下内容:
    template<typename T>
    struct rvalue_probe
    {
        ...
        operator T &() const { return *reinterpret_cast<T *>(const_cast<rvalue_probe *>(this)); }
    };
    

    在我的情况下,T是boost::unordered_map,并且某种程度上,此强制转换和帮助程序的重载组合中断了...

    解决办法?

    我研究了可能的解决方案,但是我不知道如何实际实现它们,因为我没有那么多的C++经验。我不在乎我是否在测试中进行这些编译时检查,我可以解决此问题。因此,三个方向中的任何一个都将是最有帮助的!
  • 禁用boost的右值检查,并使用BOOST_WORKAROUND和foreach.hpp中定义的文字

    BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTION
    BOOST_FOREACH_NO_RVALUE_DETECTION
    BOOST_FOREACH_NO_CONST_RVALUE_DETECTION
    BOOST_FOREACH_RUN_TIME_CONST_RVALUE_DETECTION
  • 禁用此const_cast_helper。当我运行测试程序(与测试项目不同的项目)时,我的代码将按预期进行编译和运行,const_cast的重载会产生问题。
  • 实现一个扩展,可以解决此错误。我不知道是否应该在const_cast_helperrvalue_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_cast_helper的编译。希望不会出现任何错误,现在正在运行测试...

    关于c++ - BOOST_FOREACH和cxxtest插件的转换问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18145466/

    10-11 05:58
    查看更多